401. Binary Watch -- back tracking

Posted keepac

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了401. Binary Watch -- back tracking相关的知识,希望对你有一定的参考价值。

题意: 给你个二进制手表,上面 有两排LED等,第一排为hour, 第二排为minutes。 

           告诉你表上有n 个LED 灯亮着,输出所有可能的时间。

技术分享图片

题解:  把上面 10个 LED 等 抽象成10个数 0~9, 现在亮着 n (n<9) 个灯,表示从 nums 里 取出  n 个数的“排列” 

 int[] nums = {0,1,2,3,4,5,6,7,8,9};

对于求解时间,可以用如下map, 如果 num <=5 表示 mins, 剩下的 为hour
int[] map = {1,2,4,8,16,32,1,2,4,8};

需要注意判定不合法的时间, hour>=12, mins>=60 则不合法。 还有注意输出格式, hour 可以是1位到2位, min 必须保持两位, 也就是说 min<=9 前面要补0. 

code 如下: 

class Solution {
    public List<String> readBinaryWatch(int n) {
        
        int[] nums = {0,1,2,3,4,5,6,7,8,9};
        
        int[] map = {1,2,4,8,16,32,1,2,4,8};
        
        List<String> result = new ArrayList<>();
        
        dfs(new ArrayList<>(), result, nums, n,0 , map) ;
        
        return result;
    }
    
    private void dfs(List<Integer> curResult, List<String> result, int[] nums, int n,int start,int[] map){
        if(curResult.size() == n){
             String time = convert_time(curResult,map);
             if(!time.equals("-1")) result.add(time);
              return;   
        }
        
        for(int i=start; i<nums.length; i++){
            curResult.add(nums[i]);
            dfs(curResult,result,nums,n,i+1,map);
            curResult.remove(curResult.size()-1);
        }
    }
    
    private String convert_time(List<Integer> list, int[] map){
        int hour = 0;
        int min = 0;
        for(int num: list){
            if(num<=5){
                min += map[num];
            }
            else{
               hour += map[num]; 
            }
            
            if(min>=60 || hour>=12) return "-1";
        }
        
        return String.valueOf(hour) + ":" +(min < 10 ? "0"+ String.valueOf(min): String.valueOf(min));
    }
}

 



以上是关于401. Binary Watch -- back tracking的主要内容,如果未能解决你的问题,请参考以下文章

401. Binary Watch

401. Binary Watch

401. Binary Watch

401. Binary Watch

401. Binary Watch

LeetCode 401. Binary Watch