0%

lc869.重新排序得到2的幂

869.重新排序得到 2 的幂

关键点是意识到2的幂次是有限

解法1-暴力回溯法

看到重排序就想到回溯法中的排列树问题,按照排列树的标准模板求解即可,注意排除出现前导零的情况,与

复杂度分析:

  • 时间复杂度:由于第i层共有N- i个选择,时间复杂度为O(N!)
  • 空间复杂度:递归深度为数字的长度,空间复杂度为O(N)

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public boolean backTrace(int depth, int nLength, Long curNumber, int[] visited, int[] digits){
//所有情况选取完毕
if(depth == nLength){
return isTwoPower(curNumber);
}
for(int i = 0;i < nLength;i++){
//未选用过当前位置数字,前导数字不能为0
if(visited[i] == 0 && (depth != 0 || digits[i] != 0)){
visited[i] = 1;
if(backTrace(depth + 1, nLength, curNumber * 10 + digits[i] , visited, digits))
return true;
visited[i] = 0;
}
}
}

解法2-预先计算存储法

在数字的取值范围内,一共有$2^0, 2^1,……2^{29}$ 一共30个可能取到的2的幂次,事先计算所有2幂次数字各个位置的0~9 数字出现的次数,按照顺序生成字符串存储到Map中,对于目标数字,按照相同计算步骤生成字符串,查看Map中是否含有相同字符串即可。

不想写了贴个官方题解充个数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
Set<String> powerOf2Digits = new HashSet<String>();

public boolean reorderedPowerOf2(int n) {
init();
return powerOf2Digits.contains(countDigits(n));
}

public void init() {
for (int n = 1; n <= 1e9; n <<= 1) {
powerOf2Digits.add(countDigits(n));
}
}

public String countDigits(int n) {
char[] cnt = new char[10];
while (n > 0) {
++cnt[n % 10];
n /= 10;
}
return new String(cnt);
}
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/reordered-power-of-2/solution/zhong-xin-pai-xu-de-dao-2-de-mi-by-leetc-4fvs/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。