949. Largest Time for Given Digits

很有意思的一道题目,有几种不同的思路。
首先我自己的思路:把每一种permutation都列举出来(用到了之前自己不太理解的swap的方法,还挺好用的),如果符合时间要求,就转化为string,然后保存最大的一个:
class Solution {
public:
string largestTimeFromDigits(vector<int>& A) {
string maxTime = "";
dfs(A, 0, maxTime);
return maxTime.empty() ? maxTime : maxTime.substr(0, 2) + ":" + maxTime.substr(2, 2);
}
private:
stringstream ss;
void dfs(vector<int>& A, int idx, string& maxTime) {
if (idx == A.size()) {
if (isValid(A)) {
string time = nums2Str(A);
maxTime = max(time, maxTime);
}
}
for (int i = idx; i < A.size(); ++i) {//每一层,把之后的每一个数字都放到这个位置试一试
swap(A[idx], A[i]);
dfs(A, idx+1, maxTime);
swap(A[idx], A[i]);
}
}
bool isValid(vector<int>& nums) {
if (nums[0] > 2)
return false;
if ((nums[0] == 2 && !(nums[1] > 3)) || (nums[0] < 2)) {
if (nums[2] <= 5)
return true;
}
return false;
}
string nums2Str(vector<int>& nums) {
ss.str("");
for (int num : nums)
ss << num;
return ss.str();
}
};
思路很清楚,但是代码比较繁琐。
方法二:
评论区的代码,真的暴力。。。
public String largestTimeFromDigits(int[] A) {
String ans = "";
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
for (int k = 0; k < 4; ++k) {
if (i == j || i == k || j == k) continue; // avoid duplicate among i, j & k.
String h = "" + A[i] + A[j], m = "" + A[k] + A[6 - i - j - k], t = h + ":" + m; // hour, minutes, & time.
if (h.compareTo("24") < 0 && m.compareTo("60") < 0 && ans.compareTo(t) < 0) ans = t; // hour < 24; minute < 60; update result.
}
}
}
return ans;
}
所以说这里也是暴力枚举出每一种情况,只不过这里因为只有4个元素,所以直接使用循环来枚举出来就行了。也记住这样的思路吧。
浙公网安备 33010602011771号