1. 题目来源
链接:483. 最小好进制
好的题解:
2. 题目解析
比较困难的一道数学题目。
二分的思路比较简单。枚举位数,二分进制,等比数列求和判断即可。 但是容易爆 long long
处理起来比较麻烦,自带高精的语言的福利。
通过数学式子转化不难发现其规律,可以通过当前枚举的位数直接求出 k
,如果 k
能够在当前位数下可以构成答案的话就可以直接返回了,相当快,取决于枚举位数的多少,最多是 60 位。
证明如下:
时间复杂度: O ( l o g 2 n ) O(log^2n) O(log2n)
空间复杂度: O ( 1 ) O(1) O(1)
class Solution {
public:
bool stoneGame(vector<int>& piles) {
int n = piles.size();
vector<vector<int>> f(n, vector<int>(n));
for (int len = 1; len <= n; len ++ )
for (int i = 0; i + len - 1 < n; i ++ ) {
int j = i + len - 1;
if (len == 1) f[i][j] = piles[i];
else f[i][j] = max(piles[i] - f[i + 1][j], piles[j] - f[i][j - 1]);
}
return f[0][n - 1] > 0;
}
};