1

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);
        }
    } 
}

lulouch13
13 声望6 粉丝