Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 6ef00cc

Browse files
committed
Add C++ solutions for leetcode 949.
1 parent fd199fe commit 6ef00cc

4 files changed

+225
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#include<vector>
2+
#include<algorithm>
3+
#include<iostream>
4+
using namespace std;
5+
6+
class Solution {
7+
public:
8+
/**
9+
* 4个数字全排列总共有24种可能, 判断每一种可能是否能组成合法时间值, 如果能, 再和当前保存的最大值进行比较;
10+
* 最大值是一个int值, 用来表示分钟数;
11+
*/
12+
string largestTimeFromDigits(vector<int>& arr) {
13+
int largest = -1;
14+
// 依次暴力枚举出4个数
15+
for(int i = 0; i < 4; i++) {
16+
for(int j = 0; j < 4; j++) {
17+
for(int k = 0; k < 4; k++) {
18+
if(i == j || i == k || j == k) continue;
19+
// 0,1,2,3 总和为6, 故剩下的index为6-three sum of index
20+
int l = 6 - i - j - k;
21+
22+
int res = composeTime(i, j, k, l, arr);
23+
largest = max(largest, res);
24+
}
25+
}
26+
}
27+
if(largest == -1) return "";
28+
29+
string str1(5, '0');
30+
sprintf(&str1[0], "%02d:%02d", largest / 60, largest % 60);
31+
return str1;
32+
}
33+
/* 判断输入的四个数字按照输入顺序组成的时间是否合法, 如果合法, 返回分钟数 */
34+
int composeTime(int a, int b, int c, int d, vector<int>& nums)
35+
{
36+
int hours = nums[a] * 10 + nums[b];
37+
int min = nums[c] * 10 + nums[d];
38+
39+
if(hours < 24 && min < 60)
40+
return hours * 60 + min;
41+
42+
return -1;
43+
}
44+
};
45+
46+
// Test
47+
int main()
48+
{
49+
Solution sol;
50+
vector<int> nums = {2, 0, 6, 6};
51+
auto res = sol.largestTimeFromDigits(nums);
52+
cout << res << endl;
53+
54+
return 0;
55+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
#include<vector>
2+
#include<algorithm>
3+
#include<iostream>
4+
using namespace std;
5+
6+
class Solution {
7+
public:
8+
string largestTimeFromDigits(vector<int>& arr) {
9+
sort(arr.begin(), arr.end());
10+
if (arr[0]*10 + arr[1] > 23) return "";
11+
12+
vector<vector<int>> hhs; // hour, i, j
13+
for (int i = 0; i < 4; i++)
14+
{
15+
for (int j = 0; j < 4; j++)
16+
{
17+
if (i != j && (arr[i]*10 + arr[j] < 24))
18+
hhs.push_back({arr[i]*10 + arr[j], i, j});
19+
}
20+
}
21+
sort(hhs.begin(), hhs.end(), greater<>());
22+
vector<int> validHhs;
23+
vector<int> last2num;
24+
bool ok = getValidLast2num(hhs, arr, last2num, validHhs);
25+
if (!ok) return "";
26+
int hour = validHhs.at(0);
27+
int digitB = hour % 10;
28+
int digitA = hour / 10;
29+
30+
if (last2num[0] >= 6 && last2num[1] >= 6) return "";
31+
string res = to_string(digitA) + to_string(digitB) + ":";
32+
string minu;
33+
if (last2num[0] < 6 && last2num[1] < 6)
34+
{
35+
sort(last2num.begin(), last2num.end(), greater<>());
36+
minu.push_back(last2num[0] + '0');
37+
minu.push_back(last2num[1] + '0');
38+
res += minu;
39+
}
40+
else if (last2num[0] >= 6 || last2num[1] >= 6)
41+
{
42+
sort(last2num.begin(), last2num.end());
43+
minu.push_back(last2num[0] + '0');
44+
minu.push_back(last2num[1] + '0');
45+
res += minu;
46+
}
47+
return res;
48+
}
49+
bool getValidLast2num(vector<vector<int>> hhs, vector<int> arr, vector<int>& last2num, vector<int>& validHhs)
50+
{
51+
bool canGetValidLast2num = false;
52+
for (int k = 0; k < hhs.size(); k++)
53+
{
54+
vector<int> hh = hhs[k];
55+
last2num.clear(); // 这个地方很关键
56+
for (int i = 0; i < 4; i++)
57+
{
58+
if (i != hh.at(1) && i != hh.at(2))
59+
last2num.push_back(arr[i]);
60+
}
61+
if ((last2num[0]*10 + last2num[1] <= 60) || (last2num[1]*10 + last2num[0] <= 60))
62+
{
63+
canGetValidLast2num = true;
64+
validHhs = hh;
65+
break;
66+
}
67+
}
68+
return canGetValidLast2num;
69+
}
70+
};
71+
72+
// Test
73+
int main()
74+
{
75+
Solution sol;
76+
vector<int> nums = {2, 0, 6, 6};
77+
auto res = sol.largestTimeFromDigits(nums);
78+
cout << res << endl;
79+
80+
return 0;
81+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include<vector>
2+
#include<algorithm>
3+
#include<iostream>
4+
using namespace std;
5+
6+
class Solution {
7+
public:
8+
string largestTimeFromDigits(vector<int>& A) {
9+
string res = "";
10+
sort(A.begin(), A.end());
11+
do
12+
{
13+
if ((A[0] == 2 && A[1] <= 3 || A[0] < 2) && A[2] <= 5)
14+
{
15+
string curTime = to_string(A[0]) + to_string(A[1]) + ":"
16+
+ to_string(A[2])+to_string(A[3]);
17+
if (curTime > res) res = curTime;
18+
}
19+
} while (next_permutation(A.begin(), A.end()));
20+
return res;
21+
}
22+
};
23+
24+
// Test
25+
int main()
26+
{
27+
Solution sol;
28+
vector<int> nums = {2, 0, 6, 6};
29+
auto res = sol.largestTimeFromDigits(nums);
30+
cout << res << endl;
31+
32+
return 0;
33+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#include<vector>
2+
#include<map>
3+
#include<regex>
4+
#include<algorithm>
5+
#include<iostream>
6+
using namespace std;
7+
8+
class Solution {
9+
public:
10+
string res = "";
11+
string largestTimeFromDigits(vector<int>& A)
12+
{
13+
regex pattern("([0-1][0-9]:[0-5][0-9])|([2][0-3]:[0-5][0-9])");
14+
map<int, int> dict; // 存储每个数字digit出现的次数
15+
for (int i = 0; i < A.size(); i++)
16+
dict[A[i]]++;
17+
18+
string str = "";
19+
backTrack(dict, str, pattern);
20+
return res;
21+
}
22+
void backTrack(map<int, int> dict, string str, regex& pattern)
23+
{
24+
if (str.length() == 2)
25+
str += ":";
26+
27+
if (str.length() == 5)
28+
{
29+
if (regex_match(str, pattern))
30+
res = max(res, str); //valid time
31+
32+
return;
33+
}
34+
for (auto it = dict.begin(); it != dict.end(); it++)
35+
{
36+
if (it->second != 0)
37+
{
38+
int val = it->first;
39+
dict[val]--;
40+
backTrack(dict, str + to_string(val), pattern);
41+
dict[val]++;
42+
}
43+
}
44+
}
45+
};
46+
47+
// Test
48+
int main()
49+
{
50+
Solution sol;
51+
vector<int> nums = {2, 0, 6, 6};
52+
auto res = sol.largestTimeFromDigits(nums);
53+
cout << res << endl;
54+
55+
return 0;
56+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /