681. Next Closest Time(need DFS solution)

195 篇文章 0 订阅
问题描述

Given a time represented in the format “HH:MM”, form the next closest time by reusing the current digits. There is no limit on how many times a digit can be reused.

You may assume the given input string is always valid. For example, “01:34”, “12:09” are all valid. “1:34”, “12:9” are all invalid.

Example 1:

Input: “19:34”
Output: “19:39”
Explanation: The next closest time choosing from digits 1, 9, 3, 4, is 19:39, which occurs 5 minutes later. It is not 19:33, because this occurs 23 hours and 59 minutes later.

Example 2:

Input: “23:59”
Output: “22:22”
Explanation: The next closest time choosing from digits 2, 3, 5, 9, is 22:22. It may be

题目链接:

思路分析

给一个“HH:MM”格式的时间,找到将4位数字重新组合之后的下一个最接近的时间。时间可以到下一天,4位数字可以重复使用。

A day has 1440 minutes. So we convert the time to minutes first using stoi() and substr() function. Then we add time one by one to get different next time. Using string’s find() function to determine whether a character in nextTime string is existed in the original time string. The first valid nextTime found is the answer.

代码
class Solution {
    int minutes[4] = {600, 60, 10, 1};
public:
    string nextClosestTime(string time) {
        if (time[0] == time[1] && time[0] == time[2] && time[0] == time[3])
            return time;
        int currentTime = stoi(time.substr(0, 2)) * 60 + stoi(time.substr(3));
        string nextTime = "0000";
        for (int i = 1, k = 0; i <= 1440; i++){
            int difference = (currentTime + i) % 1440;
            for (k = 0; k < 4; k++){
                nextTime[k] = '0' + difference / minutes[k];
                difference = difference % minutes[k];
                if (time.find(nextTime[k]) == string::npos)
                    break;
            }
            if (k == 4)
                break;
        }
        return nextTime.substr(0, 2) + ':' + nextTime.substr(2);
    }
};

时间复杂度:unknown
空间复杂度:unknown


反思

We also need a DFS solution which has 256 comparision to get the final answer.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值