【LeetCode】剑指 Offer 14- I. 剪绳子 p96 -- Java Version

news2024/10/2 22:16:27

题目链接:https://leetcode.cn/problems/jian-sheng-zi-lcof/

1. 题目介绍(14- I. 剪绳子)

给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

【测试用例】:
示例 1:

输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1

示例2:

输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36

【条件约束】:

提示:

  • 2 <= n <= 58

【相同题目】:

注意:

  • 本题与【LeetCode】No.343. 整数拆分 – Java Version 相同
  • 本题与 【LeetCode】剑指 Offer 14- II. 剪绳子 II – Java Version 题目相同,但剪绳子 II 调整了条件约束,变为了 2 <= n <= 1000.

2. 题解

2.1 动态规划 – O(n2)

时间复杂度O(n2),空间复杂度O(n)

动态规划,自底向上
核心思想:

  • f(1) = 0
  • f(2) = 1
  • f(3) = 2
    ……
  • f(n) = max(f(i) * f(n-i))

求解的核心问题:求出长度为n的绳子,剪成整数长度的 m 段所能得到的最大乘积;
分解成子问题:想要求出f(n),就要先求f(i) * f(n-i),并找出所有可能的最大值。

class Solution {
    // 方法一:动态规划
    public int cuttingRope(int n) {
        // 错误判断:确保长度在正确的范围内
        if (n < 2) return 0;
        if (n == 2) return 1;
        if (n == 3) return 2;
        
        // 定义数组
        int[] result = new int[n+1];
        // result数组是用来存储子问题的最优解,但是下面三个不是,而是数字本身
        result[1] = 1;
        result[2] = 2;
        result[3] = 3;

        int max = 0;
        // 循环求解,遍历每一种可能,并将最大值存入数组
        for (int i = 4; i <= n; i++){
            // 这里让j <= i/2是为了避免重复计算
            for (int j = 1; j <= i/2; j++){
                result[i] = result[j] * result[i-j];
                // 比较得出最大值
                if (result[i] > max) max = result[i];
            }
            // 把最大值存入数组
            result[i] = max;
        }
        return result[n];
    }
}

在这里插入图片描述

2.2 贪婪算法

时间复杂度O(1),空间复杂度O(1)

dp[2]= 1 = 1*1;
dp[3]= 2 = 1*2;
dp[4]= 4 = 2*2;
dp[5]= 6 = 2*3;
dp[6]= 9 = 3*3;
dp[7]= 12 = 2*2*3;
dp[8]= 18 = 2*3*3;
dp[9]= 27 = 3*3*3;
dp[10]= 36 = 2*2*3*3;

经过观察,可以得出最优分解必定是包含了2或者3的结论,也就是说只需要考虑这两种情况,就可以得出最优解!可以用数学方式来证明贪婪算法的正确性。

当 n>= 5时,我们尽可能多地剪长度为3的绳子;当剩下的绳子长度为4时,把绳子剪成两段长度为2的绳子。

class Solution {
    // 方法一:贪心算法
    public int cuttingRope(int n) {
        // 1. 错误判断:确保长度在正确的范围内
        if (n <= 3) return n-1;
        
        // 2. 看看n长度的绳子能够被剪出几根长度为3的绳子
        int timeOf3 = n/3;
        
        // 3. 当绳子最后剩下的长度为4时,把绳子剪成两段长度为2的绳子
        if (n - 3 * timeOf3 == 1) timeOf3--;
        int timeOf2 = (n- 3 * timeOf3)/2;
        
        // 4. 最后返回结果
        return (int)(Math.pow(3,timeOf3)) * (int)(Math.pow(2,timeOf2));
    }
}

在这里插入图片描述

3. 参考资料

[1] Java Math.pow(a,b) time complexity – 关于pow方法的时间复杂度的讨论
[2] 这道题必须是贪心(Greedy),谁来都不行!!!=
[3] 剪绳子(力扣官方题解)-- 数学方法可参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/369653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Mysql】InnoDB引擎

【Mysql】InnoDB引擎 文章目录【Mysql】InnoDB引擎1. 逻辑存储结构2. 架构2.1 概述2.2 内存结构2.2.1 Buffer Pool(缓冲池)2.2.2 Change Buffer(更改缓冲区)2.2.3 Adptive Hash Index(自适应hash索引)2.2.4 Log Buffer(日志缓冲区)2.3 磁盘结构2.3.1 System Tablespace(系统表空…

图解LeetCode——剑指 Offer 42. 连续子数组的最大和

一、题目 输入一个整型数组&#xff0c;数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 二、示例 2.1> 示例1: 【输入】 nums [-2,1,-3,4,-1,2,1,-5,4] 【输出】 6 【解释】 连续子数组 [4,-1,2,1] 的和最大&#xff0c;…

鉴源论坛 · 观擎丨民机机载软件中的开发和验证工具

作者 |蔡喁 上海控安可信软件创新研究院副院长 版块 | 鉴源论坛 观擎 01 工具鉴定 现代软件工程中&#xff0c;工具已经出现在软件研制过程中的各个环节中。在常见的软件研制环节中&#xff0c;使用工具包括软件需求工具、软件设计工具、软件架构工具和软件测试工具等。这…

【C++】模板与STL库

STL&#xff08;标准模板库&#xff09; 文章目录模板STL模板 模板是泛型编程的基础&#xff0c;泛型编程以一种独立于任何特定类型的方式编写代码。 模板是创建泛型类或函数的蓝图或公式。库容器&#xff0c;比如迭代器和算法&#xff0c;都是泛型编程的例子&#xff0c;它们…

线性判别分析仅在线性可分数据上能获得理想结果

Q: 线性判别分析仅在线性可分数据上能获得理想结果, 试设计一个改进方法, 使其能较好地用于飞线性可分数据 The same for “Linear discriminant analysis can only obtain ideal results on linearly separable data. Try to design an improved method to make it better us…

Vue3:自定义指令以及简单的后台管理权限封装

目录 前言&#xff1a; 自定义指令介绍&#xff1a; 局部的自定义指令&#xff1a; 全局自定义指令&#xff1a; 讲讲后台管理权限管理&#xff1a; 前言&#xff1a; 说起这个自定义指令的使用场景&#xff0c;我第一反应就是&#xff0c;后台管理的权限管理&#xff0c;要…

VBA学习——1

VBA 过程的基本语法如下&#xff1a; Sub 过程名(参数)语句1语句2...End SubVBA 函数与 VBA 过程很相似&#xff0c;除了使用的关键词外&#xff0c;主要区别是&#xff0c;函数可以返回值。 Function [函数名]([参数]) As [返回值类型]语句1 语句2 ... 语句n [函…

Servlet笔记(9):Cookie处理

一、Cookies处理 1、Cookies概念 Cookies是存储在客户端计算机上的文本文件&#xff0c;并保留各种跟踪信息。 识别返回用户的三个步骤 服务器脚本向浏览器发送一组Cookies。例如姓名、年龄或识别号码等。浏览器将这些信息存储在本地计算机上。当下一次浏览器向Web服务器发送…

SSM+HTML搭建(小白教学)

最近做项目,觉得还是有意义记录以下前后端框架是怎么搭建的,今天给大家介绍介绍SSM:SpringBootSpringMVCMyBatis后端搭建:SpringBoot快速搭建的网站(Spring Initializr)选择创建之后,会下载到一个zip压缩包,对压缩包进行解压(包地址一般选择后端项目的放的文件夹中)用idea打开项…

每日学术速递2.24

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.LG 1.BUAA_BIGSCity: Spatial-Temporal Graph Neural Network for Wind Power Forecasting in Baidu KDD CUP 2022 标题&#xff1a;BUAA_BIGSCity&#xff1a;百度KDD CUP 2022风电预测…

警惕!黑客正疯狂实施网络攻击,网站该如何防范?

自2021年以来&#xff0c;ATW组织宣称披露涉我国重要信息系统源代码、数据库等敏感信息70余次&#xff0c;涉及国家重要政府部门、航空、基础设施等100余家单位的300余个信息系统&#xff0c;尤其2022年以来&#xff0c;ATW组织滋扰势头加剧&#xff0c;持续对中国的网络目标实…

数据结构预算法之买股票最好时机动态规划(可买卖多次)

一.题目二.思路在动规五部曲中&#xff0c;这个区别主要是体现在递推公式上&#xff0c;其他都和上一篇文章思路是一样的。所以我们重点讲一讲递推公式。这里重申一下dp数组的含义&#xff1a;dp[i][0] 表示第i天持有股票所得现金。dp[i][1] 表示第i天不持有股票所得最多现金如…

【Http1.0和Http1.1的区别?Http1.1和Http2.0的区别?】

计算机网络面试的相关知识你可不能不知道呀&#xff01;Http1.0和Http1.1的区别&#xff1f;Http1.1和Http2.0的区别&#xff1f; Http1.0和Http1.1的区别&#xff1f; 连接方式 : HTTP 1.0 为短连接&#xff0c;HTTP 1.1 支持长连接。状态响应码 : HTTP/1.1中新加入了大量的状…

小型水库大坝安全监测的主要对象

一、监测背景 大坝监测的目的分成两个大的方面&#xff0c;一方面是为了验证设计、指导施工、为科研提供必要的资料&#xff1b;另一方面&#xff0c;也可以说是更重要的方面&#xff0c;就是为了长期监视大坝的安全运行。因此&#xff0c;一个成功的监测设计者不仅要能充分领会…

Vmware 虚拟机无法联通主机

问题描述&#xff1a;今天使用Vmware Workstation 创建CentOS-7 虚拟机&#xff0c;基于CentOS-7 搭建Hadoop3 伪分布式版本&#xff0c;CentOS-7 测试Hadoop 3 服务正常启动&#xff0c;通过主机连接Hadoop 3的管理平台&#xff0c;提示如下错误信息&#xff1a;尝试解决办法&…

Android---Handler 源码解析

在 android 开发中&#xff0c;经常会在子线程中进行一些操作&#xff0c;当操作完后会通过 handler 发送一些数据给主线程&#xff0c;通知主线程做响应的操作。原理&#xff1a;子线程 handler 主线程&#xff0c;其实构成了线程模型中的经典问题&#xff0c;生产者-消费者模…

HHDESK文本对比功能

对比文件夹和图片而言&#xff0c;文本的更改更加频繁且琐碎&#xff1b;个别词语的更改更是让人“健忘”。 如果有一款工具能够直观的对文本进行对比&#xff0c;并且清晰的划分显示&#xff0c;那么便可以大量节约办公人员的精力和时间。 1 文本对比功能简介 版本更新&…

Ubuntu20.04配置深度学习环境

Ubuntu20.04配置深度学习环境 对于一台新Ubuntu20.04主机&#xff0c;想要直接进行深度学习模型的训练&#xff0c;需要进行一些常规配置。本文针对的情况包括物理机和虚拟机。安装部分本文不介绍&#xff0c;只介绍配置环境部分。 1. 安装中文输入法 参考如下博客&#xff…

Web安全最详细学习路线指南,从入门到入职(含书籍、工具包)

在这个圈子技术门类中&#xff0c;工作岗位主要有以下三个方向&#xff1a; 安全研发 安全研究&#xff1a;二进制方向 安全研究&#xff1a;网络渗透方向 下面逐一说明一下. 第一个方向&#xff1a;安全研发 你可以把网络安全理解成电商行业、教育行业等其他行业一样&#x…

《卓有成效的管理者》系列-总结篇

作者【美】彼得-德鲁克简介书中提到&#xff0c;每一位知识工作者其实都是管理者&#xff0c;而且卓有成效是每个管理者必须做到的事。书中认为所有负责行动和决策而且能够提高机构工作效率的人&#xff0c;都应该像管理者一样工作和思考。而且&#xff0c;一位卓有成效的管理者…