343. 整数拆分
1 //以3来进行划分 2 class Solution 3 { 4 public: 5 int integerBreak(int n) 6 { 7 if(n <= 3) return n - 1; //必须切一刀 8 //n >= 5 2*(n-2) > n 3*(n-3) > n 且3*(n-3) >= 2*(n-2) 9 //n = 4 2 * 2 > 1 * 3 10 //2和3不能再分了 分了就变小了 且3优于2 11 int a = n / 3; 12 int b = n % 3; 13 if(b == 0) 14 { 15 //全部分成3 16 return pow(3, a); 17 } 18 if(b == 1) 19 { 20 //n = 10 3 * 3 * 3 * 1 ==> 3 * 3 * 2 * 2 21 //4 1 和 3 要变成2 * 2 22 return pow(3, a-1) * 4; 23 } 24 //b == 2 2不能再分了 25 return pow(3, a) * 2; 26 } 27 };
1 class Solution 2 { 3 vector<int> memo; 4 public: 5 int integerBreak(int n) 6 { 7 memo = vector<int>(n + 1,-1); 8 return f(n); 9 } 10 11 int f(int n) 12 { 13 if(n == 1) return 1; 14 if(memo[n] != -1) return memo[n]; 15 int res = -1; 16 // n可以拆分成两个数,也可以拆分多个数。拆分成两个数的时候乘积就是i * (n - i), 17 // 也可以选择继续拆分:f(n - i)就是将n - i继续拆分的结果 18 for(int i = 1;i < n;i ++) res = max(res,max(i * (n - i),i * f(n - i)));// 至少分割两个正整数 19 memo[n] = res; 20 return memo[n]; 21 } 22 };
Mamba never out

浙公网安备 33010602011771号