刷题顺序按照代码随想录建议
题目描述
英文版描述
Given an integer n
, break it into the sum of k
positive integers , where k >= 2
, and maximize the product of those integers.
Return the maximum product you can get.
Example 1:
Input: n = 2 Output: 1 Explanation: 2 = 1 + 1, 1 × 1 = 1.
Example 2:
Input: n = 10 Output: 36 Explanation: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36.
Constraints:
2 <= n <= 58
英文版地址
中文版描述
给定一个正整数 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
中文版地址
解题方法
动态规划
java
class Solution {
public boolean canPartition(int[] nums) {
int sum = 0;
for (int num : nums) {
sum += num;
}
if (sum % 2 != 0) {
return false;
}
int bagSize = sum / 2;
// dp[row][col] row表示从[0,1]区间上挑选一些整数(每个最多一次)总和等于col [14,9,8,4,3,2]
int[][] dp = new int[nums.length][bagSize + 1];
// 先填一行
for (int i = 0; i < bagSize + 1; i++) {
if (i >= nums[0]) {
dp[0][i] = nums[0];
}
}
for (int row = 1; row < nums.length; row++) {
for (int col = 0; col < bagSize + 1; col++) {
if (col < nums[row]) {
dp[row][col] = dp[row - 1][col];
} else {
dp[row][col] = Math.max(dp[row - 1][col], dp[row - 1][col - nums[row]] + nums[row]);
}
}
}
if (dp[nums.length - 1][bagSize] == bagSize) {
return true;
}
return false;
}
}
复杂度分析
- 时间复杂度:O(n^2),其中n是数组长度
- 空间复杂度:O(n*target),其中n是数组长度,target 是整个数组的元素和的一半