这个题想半天不会,然后看了别人的死路才写出来。主要是回溯的思想,一条路走到黑,然后退回来走另一条路。
class Solution { public: vector<int> numbers = {8,4,2,1,32,16,8,4,2,1}; vector<string> readBinaryWatch(int num) { vector<string> res; int watch[] = {0,0,0,0,0,0,0,0,0,0}; backtracking(num, 0, watch, res); return res; } void backtracking(int n, int start, int watch[], vector<string> &res) { int hour = 0; int min = 0; if(n == 0) //如果走到头了,把这个时间加入结果集合中。但是注意,小时不能大于等于12,分钟也不能大于等于60 { for(int i = 0; i <= 3; ++i) { hour += watch[i] * numbers[i]; } if(hour >= 12) return; for(int i = 4; i <= 9; ++i) { min += watch[i] * numbers[i]; } if(min >= 60) return; string s = ""; s += to_string(hour) + ":"; if(min < 10) { s+="0"; } s += to_string(min); res.push_back(s); } else {
for(int i = start; i <= 9; ++i) { watch[i] = 1; backtracking(n - 1, i + 1, watch, res); watch[i] = 0; //回溯 } } }};//如果n不为0, 那么从start这个位置开始往后的位置里再选一个置为1,n减1,继续回溯。回溯完这个位置之后,再把这个位置置回0,置下一个位置