动态规划问题解题思路:
1.递归解法(效率偏低)
/// 343. Integer Break
/// https://leetcode.com/problems/integer-break/description/
/// 暴力搜索
/// 在Leetcode中提交这个版本的代码会超时! (Time Limit Exceeded)
/// 时间复杂度: O(n^n)
/// 空间复杂度: O(n)
public class Solution1 {
public int integerBreak(int n) {
if(n < 1)
throw new IllegalArgumentException("n should be greater than zero");
return breakInteger(n);
}
// 将n进行分割(至少分割两部分), 可以获得的最大乘积
private int breakInteger(int n){
if(n == 1)
return 1;
int res = -1;
for(int i = 1 ; i <= n - 1 ; i ++)
res = max3(res, i * (n - i), i * breakInteger(n - i));
return res;
}
private int max3(int a, int b, int c){
return Math.max(a, Math.max(b, c));
}
public static void main(String[] args) {
System.out.println((new Solution1()).integerBreak(2));
System.out.println((new Solution1()).integerBreak(10));
}
}
2.记忆化搜索解法
import java.util.Arrays;
/// 343. Integer Break
/// https://leetcode.com/problems/integer-break/description/
/// 记忆化搜索
/// 时间复杂度: O(n^2)
/// 空间复杂度: O(n)
public class Solution2 {
private int[] memo;
public int integerBreak(int n) {
if(n < 1)
throw new IllegalArgumentException("n should be greater than zero");
memo = new int[n+1];
Arrays.fill(memo, -1);
return breakInteger(n);
}
// 将n进行分割(至少分割两部分), 可以获得的最大乘积
private 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;
}
private int max3(int a, int b, int c){
return Math.max(a, Math.max(b, c));
}
public static void main(String[] args) {
System.out.println((new Solution2()).integerBreak(2));
System.out.println((new Solution2()).integerBreak(10));
}
3.动态规划解法
/// 343. Integer Break
/// https://leetcode.com/problems/integer-break/description/
/// 动态规划
/// 时间复杂度: O(n^2)
/// 空间复杂度: O(n)
public class Solution3 {
public int integerBreak(int n) {
if(n < 1)
throw new IllegalArgumentException("n should be greater than zero");
int[] memo = new int[n+1];
memo[1] = 1;
for(int i = 2 ; i <= n ; i ++)
// 求解memo[i]
for(int j = 1 ; j <= i - 1 ; j ++)
memo[i] = max3(memo[i], j * (i - j), j * memo[i - j]);
return memo[n];
}
private int max3(int a, int b, int c){
return Math.max(a, Math.max(b, c));
}
public static void main(String[] args) {
System.out.println((new Solution3()).integerBreak(2));
System.out.println((new Solution3()).integerBreak(10));
}
}
1. 279 Perfect Squares
2. 91 Decode Ways
3.Unique Paths
4. Unique Paths