leetcode Integer Break
阿新 • • 發佈:2018-12-06
動態規劃問題解題思路:
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