二進位制手錶頂部有 4 個 led 代表小時(0-11),底部的 6 個 led 代表分鐘(0-59)。
每個 led 代表乙個 0 或 1,最低位在右側。
例如,上面的二進位制手錶讀取 「3:25」。
給定乙個非負整數 n 代表當前 led 亮著的數量,返回所有可能的時間。
案例:
輸入: n = 1
返回: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]
注意事項:
輸出的順序沒有要求。
小時不會以零開頭,比如 「01:00」 是不允許的,應為 「1:00」。
分鐘必須由兩位數組成,可能會以零開頭,比如 「10:2」 是無效的,應為 「10:02」。
思路分析:
第一步:我們對於給定的亮的燈個數num進行分解,分成小時燈個數hourscnt、分鐘燈個數minscnt。
第二步:然後對小時燈個數hourscnt小時的情況進行構造。(比如,當hourscnt == 1,可以構造成小時為 1,2,4,8)
第三步:接著對分鐘燈個數minscnt分鐘的情況進行構造。(比如,當minscnt== 1,可以構造成分鐘為 1,2,4,8,16,32)
第四步:最後將小時的集合和分鐘集合進行搭配組合。
class
solution
//第二步:廣度優先搜尋hours亮hourscnt個燈的情況
queue<
int>
hoursque;
hoursque.
push(0
);//亮0個燈,只有一種情況
//從0個燈開始,每次將n - 1個燈的狀態再亮乙個燈,達到n個燈
for(
int cnt =
0; cnt < hourscnt;
++cnt)}}
}//第三步:廣度優先搜尋mins亮minscnt個燈的情況
queue<
int>
minsque;
minsque.
push(0
);//亮0個燈,只有一種情況
//從0個燈開始,每次將n - 1個燈的狀態再亮乙個燈,達到n個燈
for(
int cnt =
0; cnt < minscnt;
++cnt)}}
}//第四步:將小時的集合和分鐘集合進行搭配組合。
vector<
int>
hoursvec;
//將小時佇列轉換為vector容器
while
(!hoursque.
empty()
) vector<
int>
minsvec;
//將分鐘佇列轉換為vector容器
while
(!minsque.
empty()
)int hoursvecsize = hoursvec.
size()
, minsvecsize = minsvec.
size()
;//進行組合,每次去乙個小時元素,乙個分鐘元素
**雖然有些長,但是思路非常清晰。
二進位制手錶(LeetCode)
二進位制手錶頂部有 4 個 led 代表小時 0 11 底部的 6 個 led 代表分鐘 0 59 每個 led 代表乙個 0 或 1,最低位在右側。例如,上面的二進位制手錶讀取 3 25 給定乙個非負整數 n 代表當前 led 亮著的數量,返回所有可能的時間。案例 輸入 n 1 返回 1 00 2...
二進位制手錶
二進位制手錶頂部有 4 個 led 代表小時 0 11 底部的 6 個 led 代表分鐘 0 59 每個 led 代表乙個 0 或 1,最低位在右側。例如,上面的二進位制手錶讀取 3 25 給定乙個非負整數 n 代表當前 led 亮著的數量,返回所有可能的時間。案例 輸入 n 1 返回 1 00 2...
LeetCode 401 二進位制手錶
二進位制手錶頂部有 4 個 led 代表小時 0 11 底部的 6 個 led 代表分鐘 0 59 每個 led 代表乙個 0 或 1,最低位在右側。解題思路 我自己想到的解法是用dfs去搜尋滿足條件的組合,然後看完 william 用暴力解法,解法也比較好,這裡都記錄一下。先看自己的解法。我的解法...