整数拆分
时间:2022-07-28
本文章向大家介绍整数拆分,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
343. Integer Break -- 整数拆分
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
说明: 你可以假设 n 不小于 2 且不大于 58。
分析
分割4获得最大乘积拆分为:
1 + ?分割3获得最大乘积 --》 1+? 分割2 ;2+?分割1 -- 》分割1
2+?分割2获得最大乘积
3+?分割1获得最大乘积
最优子结构:通过求子问题的最优解,可以获得原问题的最优解
一、递归
// @lc code=start
class Solution {
private:
int max3( int a, int b, int c ) {
return( a, max(b, c) );
}
// 将n进行分割(至少分割两部分),可以获得的最大乘积
int breakInteger(int n) {
if( n == 1 )
return 1;
int res = -1;
for( int i = 1; i <= n-1; i++)
// i + (n - i)
res = max3( res, i * (n-i), i * breakInteger(n-i));
return res;
}
public:
int integerBreak(int n) {
return breakInteger(n);
}
};
// @lc code=end
二、记忆化搜索
// @lc code=start
class Solution {
private:
vector<int> memo;
int max3( int a, int b, int c ) {
return( a, max(b, c) );
}
// 将n进行分割(至少分割两部分),可以获得的最大乘积
int breakInteger(int n) {
if( n == 1 )
return 1;
if ( memo[n] != -1)
return memo[n];
int res = -1;
for( int i = 1; i <= n - 1; i++)
// i + (n - i)
res = max3( res, i * (n-i), i * breakInteger(n-i) );
memo[n] = res;
return res;
}
public:
int integerBreak(int n) {
assert( n >= 1);
memo.clear();
for (int i = 0; i < n + 1; i ++)
memo.push_back(-1);
return breakInteger(n);
}
};
// @lc code=end
// @lc code=start
class Solution {
private:
vector<int> memo;
int max3(int a, int b, int c) {
return max( a, max( b, c) );
}
int breakInteger(int n) {
if ( n == 1 )
return 1;
if( memo[n] != -1 )
return memo[n];
int res = -1;
for( int i = 1; i <= n - 1; i ++ )
res = max3( res, i*(n-i), i * breakInteger(n - i) );
memo[n] = res;
return res;
}
public:
int integerBreak(int n) {
assert( n >= 1) ;
memo = vector<int>(n+1, -1);
return breakInteger(n);
}
};
// @lc code=end
自底向上
// @lc code=start
class Solution {
private:
int max3(int a, int b, int c) {
return max( a, max( b, c) );
}
public:
int integerBreak(int n) {
assert( n >= 2) ;
// memo[i]表示将数字i分割(至少分割成两部分)后得到的最大乘积
vector<int> memo(n+1, -1);
memo[1] = 1;
for (int i = 2; i <= n; i ++)
// 求解memo[i]
for(int j = 1; j <= i - 1; j++)
// j + (i-j)
memo[i] = max3( memo[i], j*(i-j), j * memo[i-j]);
return memo[n];
}
};
// @lc code=end
279. Perfect Squares
91. Decode Ways
62. Unique Paths
63. Unique Paths II
- Java实现的手工做乘法方法,给出二个字符串数字,返回相乘结果
- No.012 Integer to Roman
- 黑帽SEO剖析之手法篇
- IOS学习1——IOS应用程序的生命周期及基本架构
- 浅议“全局变量”、“多线程”和“编译器陷阱”
- Java实现的图片合并方法,支持水平和垂直合并
- OC学习15——文件I/O体系
- 用惯了ORM,居然不会写分页SQL了
- OC学习14——谓词
- 如何在32位系统中使用ROP+Return-to-dl来绕过ASLR+DEP
- 如何使用Twitter构建C;C服务器
- 【Python语言】Scikit-learn 快速入门
- 抽象SQL查询:SQL-MAP技术的使用
- 简析60度CMS的Cookies欺骗漏洞
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python爬虫-八佰词云
- python爬虫-beautifulsoup使用
- 深度学习-卷积神经网络原理
- 深度理论VGG-NET 网络
- 只要30行代码!7步教会你Python爬取网页抖音热门视频
- python苦短-CV2
- python实现语音在线合成,让你的小说自己念给你听
- Python爬虫实战:模拟登录淘宝网站
- Python制作动态二维码(附源码,复制再贴修改路径名字即可)
- 新手小白的福利,零基础也能上手的项目——学生信息管理系统
- Python制作小脚本,一键可以让你同事的电脑在你指定时间关机
- Python小白爬虫入门的第一个案例:爬取全站小说
- Python基础入门知识点——字符串的介绍
- 文章要保存为TXT文件,其中的图片要怎么办?Python帮你解决
- 分析B站弹幕,川普同志暴露的那一天,没有一个鬼畜up是无辜的