leetcode401 二进制手表
思路
回溯算法
- 每一个数字有两种可能0或者1
- 每点亮一盏灯,对应的小时数和分钟数就会改变
- 选够n个1也就是到达了能点亮的总灯数就退出
代码
class Solution {
public:
vector<string> res;
vector<string> readBinaryWatch(int turnedOn) {
vector<int> track;
//每一盏灯点亮对应的数字
vector<int> val{8,4,2,1,32,16,8,4,2,1};
dfs(turnedOn,val,0,0,0);
return res;
}
//剩余的可以亮的灯数turnedOn,开始的位置,小时hour,分钟minute
void dfs(int turnedOn,vector<int> val,int start,int hour,int minute)
{
//退出条件:没有灯可以点亮了,把现在的时间加进去
if(turnedOn==0)
{
//判断时间是否正确
if(hour>11||minute>59)
return;
string str="";
str=str+to_string(hour)+":";
if(minute<10)
str=str+to_string(0);
str=str+to_string(minute);
res.push_back(str);
return;
}
//进行选择,遍历每一盏灯
for(int i=start;i<10;i++)
{
//如果点亮的是前四盏灯,小时加对应的数值
if(i<4)
hour=hour+val[i];
else//否则分钟加上对应的数值
minute=minute+val[i];
//继续选择下一站灯
dfs(turnedOn-1,val,i+1,hour,minute);
//回溯,返回到上一盏灯
if(i<4)
hour=hour-val[i];
else//否则分钟加上对应的数值
minute=minute-val[i];
}
}
};
算法分析
时间复杂度:O(n)
空间复杂度:O(n)
算法优缺点:优点是算法比较简单,直接检索所有情况即可,缺点是时间复杂度比较高,远不如直接列举出所有情况快