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

相关文章
相关标签/搜索