适合服务行业做推广的网站,石家庄网页设计招聘,爱用系统的设计理念,二级域名如何绑定网站题目链接#xff1a;343. 整数拆分
题目描述
给定一个正整数 n #xff0c;将其拆分为 k 个 正整数 的和#xff08; k 2 #xff09;#xff0c;并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。
示例 1:
输入: n 2
输出: 1
解释: 2 1 1, 1 1 1。…题目链接343. 整数拆分
题目描述
给定一个正整数 n 将其拆分为 k 个 正整数 的和 k 2 并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。
示例 1:
输入: n 2
输出: 1
解释: 2 1 1, 1 × 1 1。
示例 2:
输入: n 10
输出: 36
解释: 10 3 3 4, 3 × 3 × 4 36。提示:
2 n 58
文章讲解代码随想录
视频讲解动态规划本题关键在于理解递推公式| LeetCode343. 整数拆分_哔哩哔哩_bilibili
题解1动态规划
思路n 可以拆分成 j 和 n - jn - j 又可以继续往下拆分即 n 的状态依赖于 j 的状态 和 n - j 的状态可以使用动态规划法。
动态规划分析
dp 数组以及下标的含义dp[i] 表示 i 拆分后的最大乘积。递推公式dp[i] Math.max(dp[i], j * (i - j), j * dp[i - j])j 为 1 到 (i - j) / 2。dp 数组初始化全部初始化为1。遍历顺序从前到后。打印 dp 数组以输入 n 10 为例dp 数组为 [ 1 empty item, 1, 1, 2, 4, 6, 9, 12, 18, 27, 36 ]。
/*** param {number} n* return {number}*/
var integerBreak function(n) {const dp new Array(n 1).fill(1);for (let i 2; i n; i) {for (let j 1; j i / 2; j) {dp[i] Math.max(dp[i], j * (i - j), j * dp[i - j]);}}return dp[n];
};
分析时间复杂度为 O(n²)空间复杂度为 O(n)。
收获
使用动态规划法要按照五部曲来本题的难点在于递推公式。