題目來源:力扣
題目描述:
二進制手錶頂部有 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;
}
}