A binary watch has 4 LEDs on the top which represent the hours (0-11), and the 6 LEDs on the bottom represent the minutes (0-59).
Each LED represents a zero or one, with the least significant bit on the right.

For example, the above binary watch reads “3:25”.
Given a non-negative integer n which represents the number of LEDs that are currently on, return all possible times the watch could represent.
Example:
Input: n = 1
Return: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]
Note:
The order of output does not matter.
The hour must not contain a leading zero, for example "01:00" is not valid, it should be "1:00".
The minute must be consist of two digits and may contain a leading zero, for example "10:2" is not valid, it should be "10:02".
Input (num)for i=max(0,num−6):min(4,num)共有Ci4×Cnum−i6种组合
解题代码
class Solution {
public:
// 从[curIndex..len)中寻找k个灯亮的中间计算值放在val中,最终结果值存放在vec中
void DFS(int len, int k, int curIndex, int val, vector<int>& vec)
{
if (k == 0 && len == 4 && val < 12) vec.push_back(val);
if (k == 0 && len == 6 && val < 60) vec.push_back(val);
if (curIndex == len || k == 0) return;
// 递归过程:分情况讨论,当前位置的灯亮还是不亮
// 尝试一下不亮当前curIndex这一位
DFS(len, k, curIndex + 1, val, vec);
// 尝试亮当前这一位,则要亮的灯就少一个,同样从下一个位置开始搜索
DFS(len, k - 1, curIndex + 1, val + pow(2, curIndex), vec);
}
vector<string> readBinaryWatch(int num) {
vector<string> ans;
// 考虑时针的亮灯个数的范围时,最少就是从0或者把分针赛满过后必须赛的,最大不超过4或者num就不够4
for (int i = max(0, num - 6); i <= min(4, num); i++)
{
vector<int> vec1, vec2;
// C(4,i) X C(6,num-i)
DFS(4, i, 0, 0, vec1), DFS(6, num - i, 0, 0, vec2);
// 组合起来
for (auto hour : vec1)
for (auto min : vec2)
{
string minute_str = (to_string(min).size() == 1 ? "0" : "") + to_string(min);
ans.push_back(to_string(hour) + ":" + minute_str);
}
}
return ans;
}
};
测试
class TestHelper{
Solution s;
public:
void run(){
vector<string> res = s.readBinaryWatch(1);
// 显示结果信息
Utils::showVecInfo(res);
}
};
结果
vector : [
0:32
0:16
0:08
0:04
0:02
0:01
8:00
4:00
2:00
1:00
]
请按任意键继续. . .