給定一個由 4 位數字組成的數組,返回能夠設置的符合 24 小時制的最大時間。ios
最小的 24 小時制時間是 00:00,而最大的是 23:59。從 00:00 (午夜)開始算起,過得越久,時間越大。git
以長度爲 5 的字符串返回答案。若是不能肯定有效時間,則返回空字符串。數組
示例 1:函數
輸入:[1,2,3,4] 輸出:"23:41"
示例 2:spa
輸入:[5,5,5,5] 輸出:""
思路1:其實只有4個數字,仍是能夠很方便想到全部狀況的。先找到<=2和<=5的數的數目is2/is5,再根據is2 = 1/2/3/4分狀況討論,須要注意的是當A[is2 - 1] = 2時,還須要看A[is5-1]是否<=3。仍是比較麻煩。code
思路2:這種涉及數組重組的,就必定能夠用排列樹哇!並且stl給了個超級好用的函數 prev_permutation/next_permutation,其功能至關於對一個數組不斷進行重組使得輸出呈降/升序blog
這道題要求給出最大時間,能夠先對原數組降序排列獲得最大值,而後用prev_permutation進行遍歷;相似的,若是要求最小時間,能夠先升序排列再用next_permutation進行遍歷。遍歷終止的條件就是該數組知足條件,在該題裏就是數組爲有效時間。字符串
#include<iostream> #include<vector> #include<algorithm> #include<string> using namespace std; class Solution { public: string largestTimeFromDigits2(vector<int>& A) { int is2 = 0; int is5 = 0; sort(A.begin(),A.end()); for(int i = 0;i<4;++i){ if(A[i] <= 2) is2++; if(A[i] <= 5) is5++; } if(is5< 2 || is2 < 1) return ""; vector<int> res(5); if(is2 == 4){ res[0] = A[is2-1]; res[1] = A[is2-2]; res[3] = A[is2-3]; res[4] = A[is2-4]; } else if(is2 == 3){ res[0] = A[is2-1]; if(is5 == 3){ if(A[2] != 2 || A[3] <= 3){ res[1] = A[3]; res[3] = A[1]; res[4] = A[0]; } else{ res[1] = A[1]; res[3] = A[0]; res[4] = A[3]; } } else{ if(A[2] != 2 || A[3] <= 3){ res[1] = A[3]; res[3] = A[1]; } else{ res[1] = A[1]; res[3] = A[3]; } res[4] = A[0]; } } else if(is2 == 2){ if(is5 == 2){ if(A[0] == 2) return ""; if(A[1] == 2){ res[0] = A[0]; res[3] = A[1]; } else{ res[0] = A[1]; res[3] = A[0]; } res[1] = A[3]; res[4] = A[2]; } else if(is5 == 3){ res[0] = A[1]; if(A[1] == 2){ if(A[2] <= 3){ res[1] = A[2]; res[3] = A[0]; } else{ res[1] = A[0]; res[3] = A[2]; } res[4] = A[3]; } else{ res[1] = A[3]; res[3] = A[2]; res[4] = A[0]; } } else{ res[0] = A[is2-1]; if(A[1] == 2){ if(A[3] <= 3){ res[1] = A[3]; res[3] = A[2]; res[4] = A[0]; } else if(A[2] <= 3){ res[1] = A[2]; res[3] = A[3]; res[4] = A[0]; } else{ res[1] = A[0]; res[3] = A[3]; res[4] = A[2]; } } else{ res[1] = A[3]; res[3] = A[2]; res[4] = A[0]; } } } else{ res[0] = A[0]; if(A[0] == 2){ if(is5 == 2) return ""; if(is5 == 3){ if(A[2] <= 3){ res[1] = A[2]; res[3] = A[1]; res[4] = A[3]; } else if(A[1] <= 3){ res[1] = A[1]; res[3] = A[2]; res[4] = A[3]; } else return ""; } else{ if(A[3] <= 3){ res[1] = A[3]; res[3] = A[2]; res[4] = A[1]; } else if(A[2] <= 3){ res[1] = A[2]; res[3] = A[3]; res[4] = A[1]; } else if(A[1] <= 3){ res[1] = A[1]; res[3] = A[3]; res[4] = A[2]; } else return ""; } } else{ res[1] = A[3]; if(is5 == 2){ res[3] = A[1]; res[4] = A[2]; } else if(is5 == 3){ res[3] = A[2]; res[4] = A[1]; } else{ res[3] = A[2]; res[4] = A[1]; } } } string s("00:00"); s[0] = res[0] + '0'; s[1] = res[1] + '0'; s[3] = res[3] + '0'; s[4] = res[4] + '0'; return s; } string largestTimeFromDigits(vector<int>& A) { sort(A.begin(),A.end(),greater<int>()); do { cout<<A[0]<<" "<<A[1]<<" "<<A[2]<<" "<<A[3]<<endl; if(A[2] < 6 && (A[0] < 2 || (A[0] == 2 && A[1] < 4))){ string s("00:00"); s[0] = A[0] + '0'; s[1] = A[1] + '0'; s[3] = A[2] + '0'; s[4] = A[3] + '0'; return s; } }while(prev_permutation(A.begin(),A.end())); return ""; } }; int main(){ vector<int> A{1,2,3,4}; Solution s; string res = s.largestTimeFromDigits(A); cout<<res<<endl; return 0; }
輸出以下:string
4 3 2 1
4 3 1 2
4 2 3 1
4 2 1 3
4 1 3 2
4 1 2 3
3 4 2 1
3 4 1 2
3 2 4 1
3 2 1 4
3 1 4 2
3 1 2 4
2 4 3 1
2 4 1 3
2 3 4 1
23:41it