太菜了,想了半天没做自己出来这个easy题,下午去翻了翻solution,发现python和我一开始想的差不多,应该是自己搞的过于复杂化了。。。
其实在获得了数组的全排列(共n!种,DFS实现)后,用一个整数time来记录当前有效时间的最大值(这块我看不太懂,用两个即hour和minute来遍历的话是不对的)遍历,注意time是用2个数--即hour*60+minute得到的。之后按照python的divmod语句,应该再将time分别分别除以60和模60,就得到了小时和分钟。
另外还要特别注意输出格式--0的存在,(就是这块让我又WA了几次),因为输出固定是XX:XX样式的,所以我们要考虑存在个位数的情况,代码如下:
class Solution {
public:
string largestTimeFromDigits(vector<int>& A) {
string res = "";
vector<vector<int>>times;
vector<int>nums;
int time = -1;
helper(A, times);
//比较大小
for (int i = 0;i < times.size();i++) {
int hour = times[i][0] * 10 + times[i][1];
int min = times[i][2] * 10 + times[i][3];
int tmp = hour * 60 + min;
if (hour >= 0 && hour < 24 && min >= 0 && min < 60) {
time = max(time, tmp);
}
}
if (time < 0) {
return res;
}
int hour = time / 60, min = time % 60;
hour < 10 ? res += '0' + to_string(hour) : res += to_string(hour);
res += ':';
min < 10 ? res += '0' + to_string(min) : res += to_string(min);
return res;
}
void helper(vector<int>A,vector<vector<int>>×) {
vector<vector<int> > res;
vector<int> out;
vector<int> visited(A.size(), 0);
DFS(A, 0, visited, out, times);
}
void DFS(vector<int> &A, int level, vector<int> &visited, vector<int> &out, vector<vector<int> > &res) {
if (level == A.size())
res.push_back(out);
else {
for (int i = 0; i < A.size(); ++i) {
if (visited[i] == 0) {
visited[i] = 1;
out.push_back(A[i]);
DFS(A, level + 1, visited, out, res);
out.pop_back();
visited[i] = 0;
}
}
}
}
};
更正:当遍历完后,小时或分钟为个位数时,先加'0'是因为输出格式固定包括4位数字,且此时在原数组中给出的0通过计算后被“忽略”掉了,因此我们在将其加到数前面,结果仍保持不变。比如当最小的hour和minute为9和3时,应输出 09:03
参考:https://leetcode.com/problems/largest-time-for-given-digits/solution/