949. Largest Time for Given Digits

949. 给定数字能组成的最大时间

给定一个由 4 位数字组成的数组,返回可以设置的符合 24 小时制的最大时间。

最小的 24 小时制时间是 00:00,而最大的是 23:59。从 00:00 (午夜)开始算起,过得越久,时间越大。

以长度为 5 的字符串返回答案。如果不能确定有效时间,则返回空字符串。

 

示例 1:

输入:[1,2,3,4]
输出:"23:41"

示例 2:

输入:[5,5,5,5]
输出:""

 

提示:

  1. A.length == 4
  2. 0 <= A[i] <= 9

解法一

//时间复杂度O(1), 空间复杂度O(1)
class Solution {
public:
    bool match(int hour, int minute, vector<int>& A) {
        vector<int> B = {hour / 10, hour % 10, minute / 10, minute % 10};
        sort(B.begin(), B.end());
        return B == A;
    }
    string largestTimeFromDigits(vector<int>& A) {
        sort(A.begin(), A.end());
        int hour = 23, minute = 59;
        while(hour >= 0) {
            if(match(hour, minute, A))
                return to_string(hour / 10) + to_string(hour % 10) + ':' +
                       to_string(minute / 10) + to_string(minute % 10);
            if(minute-- < 0) {
                minute = 59;
                hour--;
            }
        }
        return "";
    }
};

解法二

//时间复杂度O(1), 空间复杂度O(1)
class Solution {
public:
    bool check(vector<int>& A) {
        if(A[0] > 2 ||
           A[0] == 2 && A[1] > 3 ||
           A[2] > 5) 
            return false;
        return true;
    }
    string largestTimeFromDigits(vector<int>& A) {
        int hour = -1, minute = -1;
        sort(A.begin(), A.end());
        do {
            if(!check(A)) continue;
            int hour1 = A[0] * 10 + A[1];
            int minute1 = A[2] * 10 + A[3];
            if(hour < hour1 || hour == hour1 && minute < minute1) {
                hour = hour1;
                minute = minute1;
            }
        } while(next_permutation(A.begin(), A.end()));
        return hour == -1 ? "" : to_string(hour / 10) + to_string(hour % 10) + ':' +
                                 to_string(minute / 10) + to_string(minute % 10);
    }
};

思路:

解法一(略低效)

穷举法,对所有合法的时间进行遍历,尝试匹配给定数组A。从23:59开始向下遍历,直到找到第一个与A包含元素一样的时间,若到00:00没有找到,就返回空串。

解法二

不对所有时间遍历,而是对给定数组A求全排列,对于每一个排列,先check其合法性,若合法且时间大于hour:minute,就更新hour:minute,最后返回hour:minute的字符串形式。

这里全排列使用了标准库的next_permutation(),也可以自已实现全排列算法,代码稍长,待日后整理一下。

2019/08/18 00:42
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值