题目链接
英文链接:https://leetcode.com/problems/smallest-good-base/
中文链接:https://leetcode-cn.com/problems/smallest-good-base/
题目详述
对于给定的整数 n, 如果n的k(k>=2)进制数的所有数位全为1,则称 k(k>=2)是 n 的一个好进制。
以字符串的形式给出 n, 以字符串的形式返回 n 的最小好进制。
示例 1:
1 | 输入:"13" |
示例 2:
1 | 输入:"4681" |
示例 3:
1 | 输入:"1000000000000000000" |
提示:
- n的取值范围是 [3, 10^18]。
- 输入总是有效且没有前导 0。
题目详解
- 就是找到一个最小的进制,它的所有位为 1,恰好表示为 n。
- 根据题意,n 的取值范围是 [3, 10^18],这样的进制必然存在,因为存在一个
n - 1
进制它的表示为11
。 - 这里有两个变量,一个是进制,一个是对应进制下的长度。可以固定一个变量,然后判断是否满足条件即可。进制的取值范围为
[2, n - 1]
,范围太大,所以应该固定长度,判断是否存在满足条件的进制。 - 进制越小,长度越长;进制越大,长度越短。我们可以从大到小枚举长度,判断是否存在满足条件的进制,这一步可以运用二分查找。
- 枚举长度的时间复杂度为
O(logn)
,二分查找的时间复杂度为O(logn)
,辅助计算的时间复杂度为O(logn)
,总的时间复杂度为O(logn ^ 3)
。
1 | public class LeetCode_00483 { |