leetcode:二進制手錶

題目來源:力扣

題目描述:

二進制手錶頂部有 4 個 LED 代表小時(0-11),底部的 6 個 LED 代表分鐘(0-59)。
每個 LED 代表一個 0 或 1,最低位在右側。
0011011001代表3:25
給定一個非負整數 n 代表當前 LED 亮着的數量,返回所有可能的時間。
注意事項:
輸出的順序沒有要求。
小時不會以零開頭,比如 “01:00” 是不允許的,應爲 “1:00”。
分鐘必須由兩位數組成,可能會以零開頭,比如 “10:2” 是無效的,應爲 “10:02”。

審題:

此題考慮使用回溯法處理是比較簡單的,考慮回溯過程中的每一步可選子集:點亮或不點亮.如果當前點亮的燈小於n,並且對於小時位,點亮後保證小於等於11,對於分鐘位,點亮後保證分鐘小於等於59,則當前位可以點亮.對於當前可以點亮的情形,我們有兩種選擇,點亮或不點亮,而對於無法點亮的情形,我們只能選擇不點亮.
如果當前點亮的燈數等於n,則當前結果爲一個可能的時間.保存當前時間並返回.如果當前已經檢查了所有10個位置,並且點亮的小於n,則未構成可能時間.遞歸返回.

java算法:

class Solution {
    
    private void dfs(int num, int i, int hour, int minute, List<String> list){
        if(num == 0){
            StringBuilder s = new StringBuilder();
            s.append(hour);
            s.append(":");
            if(minute < 10)
                s.append(0);
            s.append(minute);
            list.add(s.toString());
            return;
        }

        if(i > 10)
            return;

        if((i <= 4 && hour + (1 << 4-i) > 11) || (i > 4 && minute + (1 << 10-i) > 59)){
            //小時最多爲11, 分鐘最多爲59,當滿時,燈不能再點亮.
            dfs(num, i+1, hour, minute, list);
        }
        else{
            dfs(num, i+1, hour, minute, list); //不點亮當前燈
            if(i <= 4)
                dfs(num-1, i+1, hour+(1 << 4-i), minute, list);
            else
                dfs(num-1, i+1, hour, minute+(1 << 10-i), list);
        }
    }

    public List<String> readBinaryWatch(int num) {
       
        List<String> list = new ArrayList<>();
        dfs(num, 1, 0, 0, list);
        return list;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章