IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 剑指offer 14Ⅰ.57Ⅱ.62. 数学(中等) -> 正文阅读

[数据结构与算法]剑指offer 14Ⅰ.57Ⅱ.62. 数学(中等)

14Ⅰ.

题目:

剑指 Offer 14- I. 剪绳子icon-default.png?t=M1H3https://leetcode-cn.com/problems/jian-sheng-zi-lcof/

想法1:动态规划,每次选择剪掉j长度,然后剩下可以选择剪或者不剪,再求max

代码1:

class Solution {
    public int cuttingRope(int n) {
        // 下标2->n存储每个数的最大乘积
        int[] dp = new int[n+1];
        // n>1并且m>1 
        // dp[1]=1; 
        // 不初始化则dp[1]=0, 当i-j==1时,j*dp[i-j],j*(i-j)中总有j*(i-j)=j更大,所以无需初始化
        dp[2]=1;
        for(int i=3;i<=n;i++){
            // 依次选择不同长度的j剪
            for(int j=1;j<i-1;j++){
                // 转移方程如下:
                // 1.剪掉长度为j的绳子之后,继续剪或者不剪,都可以.
                // 2.当j不同时,求出最大的dp[i]
                dp[i]=Math.max( dp[i],Math.max(j*dp[i-j],j*(i-j)) );
            }
        }
        return dp[n];
    }
}

想法2:数学 长度为2或3时不剪更好,长度为4时剪成2.2比1.3好,长度为5及以上时剪比不剑剪好.

代码2:

class Solution {
    public int cuttingRope(int n) {
        if(n <= 3) return n - 1;
        int a = n / 3, b = n % 3;
        if(b == 0) return (int)Math.pow(3, a);
        if(b == 1) return (int)Math.pow(3, a - 1) * 4;
        //if(b == 2)
        return (int)Math.pow(3, a) * b;
    }
}

结果:

?

57Ⅱ.

题目:

剑指 Offer 57 - II. 和为s的连续正数序列icon-default.png?t=M1H3https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/

?想法1:因为要求连续的正数序列,想到滑窗,从第一个和第二个开始,用sum表示窗内数字的和.具体见代码.

代码1:

class Solution {
    public int[][] findContinuousSequence(int target) {
        //定义s为滑窗和
        int left=1,right=2,sum=3;
        List<int[]> res = new ArrayList<>();
        while(left<right){
            if(sum==target){
                //找到一组连续数字和为target
                int[] tmp = new int[right-left+1];
                for(int i=left;i<=right;i++){
                    tmp[i-left]=i;
                }
                res.add(tmp);
                // sum-=left;
                // left++;
            }
            if(sum<target){
                //连续数字和<target,应将right右移,继续往后找
                right++;
                //right右移后,sum加上新right的值
                sum+=right;
            }else{ //if(sum>=target)
                //left右移前,sum减去旧left的值
                sum-=left;
                //连续数字和<target,应将left右移,继续往后找
                left++;
            }
        }
        //这里也可以写new int[0][]
        return res.toArray(new int[res.size()][]);
    }
}

结果1:

想法2:每次从头遍历i,滑动右边界j.计算窗内数字和.

代码2:

class Solution {
    public int[][] findContinuousSequence(int target) {
        List<int[]> res = new ArrayList<>();
        for(int i=1;i<=target;i++){
            int sum=0;
            int cnt=0;
            for(int j=i;j<=target;j++){
                sum+=j;
                cnt++;
                if(sum==target && cnt!=1){
                    int[] tmp= new int[j-i+1];
                    for(int k=i;k<=j;k++){
                        tmp[k-i]=k;
                    }
                    res.add(tmp);
                    break;
                }
                if(sum>target)
                    break;
            }
        }
        return res.toArray(new int[res.size()][]);
    }
}

结果2:

62.

题目:

?剑指 Offer 62. 圆圈中最后剩下的数字icon-default.png?t=M1H3https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/

?

?想法参考:讲的好清晰!力扣icon-default.png?t=M1H3https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/solution/huan-ge-jiao-du-ju-li-jie-jue-yue-se-fu-huan-by-as/

写出动规代码 使用dp[] 或者不使用也可以

//只用公式 不使用dp[]
class Solution {
    public int lastRemaining(int n, int m) {
        // 最后的幸存者在数组中的下标一定是0
        int pos = 0;
        for (int i = 2; i <= n; i++) {
            pos = (pos + m) % i;
        }
        return pos;
    }
}

//动规 使用dp[]
class Solution {
    public int lastRemaining(int n, int m) {
        int[] dp = new int[n+1];
        dp[1]=0;
        for(int i=2;i<=n;i++){
            dp[i]=(dp[i-1]+m)%i;
        }
        return dp[n];
    }
}

结果:

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-19 01:25:35  更:2022-02-19 01:26:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 15:26:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码