401. Binary Watch
题目链接:https://leetcode.com/problems...
又是一道不像easy的题。。
首先是穷举,把小时从0到11,和分钟从0到59所有的可能穷举一遍,1的数量等于num时就加入结果。 参考discussion里的:
https://discuss.leetcode.com/...
backtracking是可以做的,分开考虑小时和分钟,分别做dfs,然后合在一起。参考discussion里面。
https://discuss.leetcode.com/...
注意hour至多4位,minute至多6位,所以i <= 4, num - i <= 6,h要小于12,m要小于60。
public class Solution {
public List<String> readBinaryWatch(int num) {
List<String> result = new ArrayList();
if(num < 0 || num > 10) return result;
for(int i = Math.max(0, num-6); i <= Math.min(num, 4); i++) {
List<Integer> hours = new ArrayList();
dfs(hours, 0, i, 0, hour);
List<Integer> minutes = new ArrayList();
dfs(minutes, 0, num - i, 0, minute);
for(int h : hours) {
if(h >= 12) continue;
for(int m : minutes) {
if(m > 59) continue;
result.add(String.format("%d:%02d", h, m));
}
}
}
return result;
}
int[] hour = {1, 2, 4, 8};
int[] minute = {1, 2, 4, 8, 16, 32};
private void dfs(List<Integer> time, int index, int light, int cur, int[] num) {
if(light == 0) {
time.add(cur);
return;
}
if(index == num.length) return;
for(int i = index; i < num.length; i++) {
dfs(time, i + 1, light - 1, cur + num[i], num);
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。