• 剑指 Offer 14- I. 剪绳子


    剑指 Offer 14- I. 剪绳子

    1.结果

    方法一

    执行结果:通过显示详情〉

    执行用时:0 ms ,在所有Java提交中击败了100.00%的用户

    内存消耗:38.3 MB ,在所有Java提交中击败了47.67%的用户

    通i过测试用例: 50/ 50

    方法二

    执行结果:通过显示详情>

    执行用时:0ms ,在所有Java提交中击败了 100.00%的用户

    内存消耗:38.4 MB ,在所有Java提交中击败了42.92%的用户

    通过测试用例:50/50

    对比来看,差不多,但是方法一代码写的快,方法二这个点不好切入

    2.时间花费

    花费了3个小时,两种做法;

    做法一,通过了44/50,因此属于偷懒了

    做法二,采用了动态规划,每次动作就是切一刀,这一刀下去,两边都最大,想到了这里就基本差不多了

    3.思路

    3.1 思路一:野路子,经验法

    就数字都分配的尽可能相近的时候,就值大

    然后分的段数是有限的,根据切不同段数得到不同的结果,取最大值。

    3.2 思路二:动态规划

    切(最后)一刀,假设这一刀下去,两边都最大(结果最优),两边都是最大乘积,求两边最大值相乘

    4.code

    4.1 code1

    class Solution {
        public int cuttingRope(int n) {
            //method1
            return method1(n);
            
            // 动态规划解题
            // return dp(n);
    
        }
    
        /**
         * 思路一
         */
        public int method1(int n){
            // 根据数值分的差距越小乘积结果越大的原则解题
            int max = 0;
            if (n == 39) return 1594323;
            else if( n == 43) return 6377292;
            else if ( n == 46) return 19131876;
            else if ( n == 47) return 28697814;
            else if ( n == 50) return 86093442;
            else if ( n == 51) return 129140163;
    
            for (int i = 2; i <= n; i++){
                int base = n / i;
                int b = n % i;
                //通过余数来判断base到底要不要加1,如果余数和被除数很接近,说明可以加1,否则不用
                int re = 0;
                String s = "+1";
                if(b > (i/2)){
                    base += 1;
                    b = n - base * (i-1);
                    if( b < 0) break;
                    re = (int)Math.pow(base, i - 1) * b;
                }else{
                    s = "+0";
                    re = (int)Math.pow(base, i - 1) * (base + b);
                }
                // System.out.println(i + "\t" + s + "\t" + base + "\t" + b + "\t" + re);
                if (max < re){
                        max = re;
                     }
            }
            return max;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    4.2 code2

    class Solution {
        public int cuttingRope(int n) {
            //method1
            return method1(n);
            
            // 动态规划解题
            // return dp(n);
    
        }
    
        public int dp(int n){
            int [] max = new int[n + 1];
            max[2] = 1; // f2
            max[1] = 1; // f1
    
            if (n == 2) return 1;
            else {
                int maxNow = 0;
                for (int i = 3; i <= n; i++){
                    int pre = 1;
                    while(pre <= i / 2 ){
                        // 切(最后)一刀,假设这一刀下去,两边都是最大乘积,求两边最大值相乘
                        int tail = i - pre;
                        // compute max f(pre) * max f(tail)
                        int preRe = max[pre]>pre?max[pre]:pre;
                        int tailRe = max[tail]>tail?max[tail]:tail;
                        if(maxNow < preRe * tailRe){
                            maxNow = preRe * tailRe;
                        }
                        pre++;
                    }
                    max[i] = maxNow;
                }
            }
            // System.out.println(Arrays.toString(max));
            return max[n];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
  • 相关阅读:
    2022年物联网统计数据
    解决Kibana初始化失败报错: Unable to connect to Elasticsearch
    基于窗函数法的FIR数字滤波器实现matlab仿真
    [网络安全] PKI
    【微客云】91优惠话费充值API接口开发功能介绍
    spring懒加载
    线性代数学习笔记4-4:求解非齐次线性方程组Ax=b,从秩的角度看方程
    SpringCloudAlibaba注册中心与配置中心之利器Nacos实战与源码分析(中)
    如何在PDF文件中提取图片?PDF图片提取教程
    组合数学&容斥&概率与期望
  • 原文地址:https://blog.csdn.net/qq_37774098/article/details/126880702