Jianzhiオファー14-I。ロープを切る
タイトル説明
問題解決のアイデア
dp
リファレンスソリューション:動的計画法、数学
この質問は343の変形です。整数分割、公式の質問は明確に説明されています。
時間o(n²)、空間o(n)
class Solution {
public int cuttingRope(int n) {
//定义:dp[i]表示对于长度为i的绳子,剪成至少两段后可能的最大乘积
int[] dp = new int[n + 1];
//base case
dp[1] = 1;
for (int i = 2; i <= n; i++) {
for (int j = 1; j < i; j++) {
//两种选择:每次将 i - j 剪出来后,剩下的 j 的部分选择不剪或继续剪
dp[i] = Math.max(dp[i], Math.max(j * (i - j), dp[j] * (i - j)));
}
}
return dp[n];
}
}
数学
結論:分割整数がeに近いほど、積は大きくなります。
n%3の結果に従ってディスカッションを分類します(m = n / 3と仮定します)
- n%3 == 0の場合、m3に分割します
- n%3 == 1の場合、m-13と22に分割します。
- n%3 == 2の場合、m3と12に分割します。
上記の説明は、n≥4の場合であり、n≤3の場合は適用されないため、個別に説明する必要があります。
- n = 2の場合、2 = 1 + 1であり、最大積は1です。
- n = 3の場合、3 = 1 + 1 + 1 = 1 + 2の2つのケースがあり、最大積は2である
ため、最大積= n-1に組み合わせることができます。
時間o(1)、空間o(1)
ヒント:整数および剰余演算の場合、マシンの数を超えない整数はO(1)と見なすことができます。
class Solution {
public int cuttingRope(int n) {
if (n <= 3) {
return n - 1;
}
int quotient = n / 3;
int remainder = n % 3;
if (remainder == 0) {
return (int)Math.pow(3, quotient);
} else if (remainder == 1) {
return (int)Math.pow(3, quotient - 1) * 4;
} else {
return (int)Math.pow(3, quotient) * 2;
}
}
}