949. 給定數字能組成的最大時間

給定一個由 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

相關文章
相關標籤/搜索