• 8月算法训练------第十四天(数学)解题报告


    8月算法训练------第十四天(数学)解题报告

    题目类型:数学
    题目难度:中等

    第一题、剑指 Offer 14- I. 剪绳子

    1. 题目链接:剑指 Offer 14- I. 剪绳子
    2. 思路分析:
      本题要获得最大的乘积,经过理论推导,每一段要尽量分割成长度为3,所以要只需看能分割成几段3,就计算3的几次方。
      当余数为0时,直接返回3的n次方;
      当余数为1时,将返回3的n-1次方*4;
      当余数为2时,返回3的n次方*2;
    3. 代码:
    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;
            return (int)Math.pow(3, a) * 2;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    第二题、剑指 Offer 57 - II. 和为s的连续正数序列

    1. 题目链接:剑指 Offer 57 - II. 和为s的连续正数序列
    2. 思路分析:
      这一题简单思路就是算起始项为 a 1 a_1 a1,公差为1的等差数列前n项和。
      等差数列的前n项和公式:
      d 2 n 2 + ( a 1 − d 2 ) n = t a r g e t \frac{d}{2}n^2+(a_1-\frac{d}{2})n=target 2dn2+(a12d)n=target
      将这个公式整理得:
      d 2 n 2 + ( a 1 − d 2 ) n − t a r g e t = 0 \frac{d}{2}n^2+(a_1-\frac{d}{2})n-target=0 2dn2+(a12d)ntarget=0
      a 1 a_1 a1可以根据循环枚举出来,根据二元一次方程求解公式:
      n = − b ± ( b 2 − 4 a c ) 2 a n=\frac{-b\pm\sqrt(b^2-4ac)}{2a} n=2ab±( b24ac)
      只要根是正整数,根据这个公式求出长度就能得到答案,将所有满足得答案排成二维数组返回。
    3. 代码:
    class Solution {
        public int[][] findContinuousSequence(int target) {
            List<int[]> res = new ArrayList<>();
            for(int a1 = 1; a1 <= target/2; a1++){
                double b = a1 - 0.5;
                double n = 0.5 - a1 + Math.pow(b*b+2*target, 0.5);
                if(n % 1 == 0){
                    int[] mar = new int[(int)n];
                    for(int i = (int)a1; i < (int)n + (int)a1; i++){
                        mar[i - (int)a1] = i;
                    }
                    res.add(mar);
                }
            }
            return res.toArray(new int[res.size()][]);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    第三题、剑指 Offer 62. 圆圈中最后剩下的数字

    1. 题目链接:剑指 Offer 62. 圆圈中最后剩下的数字
    2. 思路分析:
      约瑟夫环问题,每次循环都在后面加上m然后再与i取余,当循环n-1次后就得到了答案。
    3. 代码:
    class Solution {
        public int lastRemaining(int n, int m) {
            int fin = 0;
            for(int i = 2; i != n+1; i++){
                fin = (fin + m) % i;
            }
            return fin;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    Leecode刷题 383.赎金信——哈希表
    Android SDK目录结构
    【重识云原生】第六章容器6.1.2节——容器安装部署
    Docker从入门到进阶之基础操作(3)—— 仓库(Repository)
    go语言基础操作--二
    SpringBoot Lombok的使用
    JS代码压缩
    面向对象设计原则快速理解
    pytest + yaml 框架 - 3.全局仅登录一次,在用例中自动在请求头部添加Authentication token认证
    发送钉钉、邮件、手机信息
  • 原文地址:https://blog.csdn.net/weixin_51597441/article/details/126334495