剑指 Offer 14- I. 剪绳子(343. 整数拆分)&& 剑指 Offer 14- II. 剪绳子 II —思路和心得

2023-11-19

剑指 Offer 14- I. 剪绳子

在这里插入图片描述
和剪绳子1相同的题:
在这里插入图片描述
思路:利用动态规划:
因为每个长度大于3的绳子的最大值都可以划分为2和3的乘积
我们想将长度为 2 3的绳子的最大值先算出来
然后再利用动态规划,进步算出长度为n的绳子的最大值

class Solution {
    /*
    思路:利用动态规划
    因为每个长度大于3的绳子的最大值都可以划分为2和3的乘积
    我们想将长度为 2 3的绳子的最大值先算出来
    然后再利用动态规划,进步算出长度为n的绳子的最大值
    */
    public int cuttingRope(int n) {
    //长度为2时的最大值    
    if(n==2)return 1;

    //长度为3的时候的最大值
    if(n==3)return 2;

    //创建动态规划数组
    int[] dp=new int[n+1];

    //因为最大值一定是2 3的组合,所以,我们将dp[2]和dp[3]赋值为2 3
    dp[2]=2;
    dp[3]=3;

    //进行动态规划
    for(int i=4;i<=n;i++){
        for(int j=1;j<=i/2;j++){
            dp[i]=Math.max(dp[j]*dp[i-j],dp[i]);
        }
    }
    return dp[n];
    }
}

评论区的一位大神的贪心解法:

b站up的视频讲解链接:【剑指offer 14- II. 剪绳子 II-哔哩哔哩】 https://b23.tv/gp3OtKN(讲的很清晰,是剪绳子ii的,方法原理一致)

class Solution {
/*
利用的是一种贪心的求法:
   因为规律可以知道,绳子的最大值可以被分解为2和3的乘积,而乘积中3越多,乘积越大,越接近我们要的最大值。
   所以我们的思路就是乘尽可能多的3.
*/
    public int cuttingRope(int n) {
    //排除几个情况(剩余绳子的长度)
        if(n == 2)
            return 1;
        if(n == 3)
            return 2;
          
        int res = 1;
        //开始剪绳子
        while(n > 4){
        //不断把当前的绳子剪3
            res *= 3;
            n -= 3;
        }
        //返回(最后剩下的一定是小于等于4的长度,所以直接乘上去就行)
        return res * n;
    }
}

剑指 Offer 14- II. 剪绳子 II

在这里插入图片描述
这题相比于上一个题,就是多了大数处理,因为max函数无法操作取余后的数,所以我们要对上一道题的动态规划解法做一点处理,同时对贪心解法,进行一点大数取余改进。

动态规划:

import java.math.BigInteger;
class Solution {
    public int cuttingRope(int n) {
        //使用BigInteger
        BigInteger dp[] = new BigInteger[n + 1];
        //将数组里每一个变量都填充为1
        Arrays.fill(dp, BigInteger.valueOf(1));
        
        for (int i = 3; i <= n; i++) {
            for (int j = 1; j < i; j++) {
                dp[i] = dp[i].max(BigInteger.valueOf(j * (i - j))).max(dp[i - j].multiply(BigInteger.valueOf(j)));
            }
        }
        return  dp[n].mod(BigInteger.valueOf(1000000007)).intValue();
    }
}

贪心解法:

	class Solution {
    public int cuttingRope(int n) {
        if(n == 2)
            return 1;
        if(n == 3)
            return 2;
        //改进1:因为int不满足范围,我们要使用long
        long res = 1;
        
        while(n > 4){
            res *= 3;
            //这里要每一步进行取余
            res = res % 1000000007;
            n -= 3;
        }
        //结果强制转换为int,同别忘取余
        return (int)(res * n % 1000000007);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

剑指 Offer 14- I. 剪绳子(343. 整数拆分)&& 剑指 Offer 14- II. 剪绳子 II —思路和心得 的相关文章

随机推荐

  • redis默认过期时间:redis默认的是永不过期

    今天同事问我redis默认过期时间是多久 突然想起几年前想查一下redis默认过期时间是多久 搜到的博文全是打着 redis默认过期时间是多久 的标题在讲redis过期原理 正好闲来没事 又搜了下 几年过去了 还是一样 哪来那么多文不对题的
  • StackExchange.redis 实现模糊匹配批量查询

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net Helloantoherday article details 81286685 如果
  • 一、C++中queue和deque的区别

    1 先明白队尾和队首 back和front的联系 无论从哪个方向看 插入的地方就是队尾 所有的操作名字都与back有联系 插入端的另一端就是队首 所有的操作名字都与front有联系 其中queue的操作是 queue
  • jdbc连接mysql数据库,设置字符集编码

    jdbc连接mysql数据库 设置字符集编码 1 第一种方法 JDBC连接数据库时常会出现乱码的情况 那是因为我们的字符级与数据库的字符级不一样 我们通过定义url地址的时候定义字符级 sql代表你的数据库名称 所以当这种情况遇到乱码的时候
  • 交叉编译arm Linux环境下的android-tools-adb

    前言 项目使用Rockchip的3399挖掘机demo板 使用官方提供的Debian Linux SDK 官方github源码链接 https github com rockchip linux 进行开发定制 当前需要将Android上的调
  • 阿辉闯编程(Java入门)

    故事背景 hello 大家好 我叫阿辉 在某一个风雨交加的夜晚 我也不知道干了什么惹怒了老天爷 可能是嫉妒我帅气的颜值吧 一道闪电轰然劈下 我便晕死了过去 等我再次睁开眼睛的时候 我发现我来到了一个不知名的地方 于是我问向了一旁的人 这里是
  • 豪华股东阵容加持,九方财富有望成港股“大肉签”

    经过一段时间的盘整 曾经因行业冷却而沉寂的港股打新正在重回投资者偏好之中 2月28日启动正式招股的新股 九方财富 就受到了投资者的广泛关注 自去年底以来 港股随全球资本市场大势好转 逐渐脱离底部 也提升了市场对新股的热情 同时 九方财富与其
  • xposed开发之清除应用数据(研究历程)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 最近在研究xposed 有个需求要做到清除其他应用数据 xposed功能足够强大 应该可以实现这个功能 下面是基于android4 4 4研究的思路 google只能开放了
  • Mac OS X 下如何使用类似 Linux 下的 /proc/pid/maps 功能

    本文转载至 http stackoverflow com questions 8058005 mac os x equivalent of virtualquery or proc pid maps 一言以概之 使用 vmmap 不过格式和
  • Objective-C语法之代码块(block)的使用

    代码块本质上是和其他变量类似 不同的是 代码块存储的数据是一个函数体 使用代码块是 你可以像调用其他标准函数一样 传入参数数 并得到返回值 脱字符 是块的语法标记 按照我们熟悉的参数语法规约所定义的返回值以及块的主体 也就是可以执行的代码
  • Microsemi Libero使用技巧6——FPGA全局网络的设置

    文章目录 前言 问题描述 问题分析 FPGA全局布线资源简介 Microsemi FPGA的全局布线资源 全局网络改为普通输入 普通输入上全局网络 总结 推荐阅读 交流群 系列教程 Microsemi Libero系列教程 前言 刚开始做M
  • linux内核-软中断与Bottom Half

    中断服务一般都是在将中断请求关闭的条件下执行的 以避免嵌套而使控制复杂化 可是 如果关中断的时间持续太长就可能因为CPU不能及时响应其他的中断请求而使中断 请求 丢失 为此 内核允许在将具体的中断服务程序挂入中断请求队列时将SA INTER
  • 刷脸支付越来越多的场景开始让人们靠脸吃饭

    技术的唯一目的是保护用户的安全 至于面部 指纹以及生物识别以外的技术手段 皆是抵达目的地的方式方法 在刷脸支付真正使用的过程中 工程师们一直在那些我们看不见的地方 默默谱写着隐私安全的前序曲 刷脸支付是基于人工智能 机器视觉 3D传感 大数
  • 【matlab图像处理笔记2】【图像变换】(一)图像的算术运算与几何变换、图像插值算法

    文章目录 前言 图像的算术运算 图像相加 图像差分 图像乘法 图像除法 图像的线性组合 图像的几何变换 图像平移 图片镜像 图片转置 图像旋转 图像缩放 图像插值算法 最近邻插值算法 双线性插值算法 单线性插值 双线性插值 双三次插值算法
  • VUEX各个模块的封装以及Router封装

    一 各个模块的作用 state 用来数据共享数据存储 mutation 用来注册改变数据状态 同步 getters 用来对共享数据进行过滤并计数操作 action 解决异步改变共享数据 异步 二 创建文件 actions js getter
  • 5种常见函数的写法和调用方式

    前言 函数在开发中随处可见 经常在开发中我们声明函数就使用了一两种就已经足够了 但是 对我这有梦想的码农来说 这显然是不够的 因此 总结整理了5中常见的声明方式和调用方式 1 函数声明 最常规写法 常规函数写法 function bar c
  • Request processing failed;nested exception is java.lang.*

    目录 问题 分析 解决 附录 注意 参考 问题 错误1 httpClient向服务端发送请求 服务端有时候就会给客户端返回 500错误 打开服务端错误日志 报如下错误 2021 05 28 21 05 06 548 default http
  • 面试官让我讲讲分布式系统容错架构,结果。。。

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 TB级数据放在一台机器上 难啊 到底啥是分布式存储 啥又是分布式存储系统 某台机器宕机了咋办 Master节点如何感知到数据副本消失 如何复制副本保持足够副本数
  • 遥感新赛事!变化检测、图像融合等比赛全面启动!2023"国丰东方慧眼杯"遥感影像智能处理算法大赛来了!...

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 2023 国丰东方慧眼杯 遥感影像智能处理算法大赛火热进行中 遥感影像智能处理算法大赛是国家自然科学基金委信息科学部 空间信息网络基础理论与关键技术 重大研究计划指导专
  • 剑指 Offer 14- I. 剪绳子(343. 整数拆分)&& 剑指 Offer 14- II. 剪绳子 II —思路和心得

    剑指 Offer 14 I 剪绳子 和剪绳子1相同的题 思路 利用动态规划 因为每个长度大于3的绳子的最大值都可以划分为2和3的乘积 我们想将长度为 2 3的绳子的最大值先算出来 然后再利用动态规划 进步算出长度为n的绳子的最大值 clas