leetcode--949(contest113) 给定数字能组成的最大时间

这是一道关于LeetCode第949题的解析,题目属于简单级别。文章讨论了如何从给定数字中构建出最大的有效时间。作者提到初看问题复杂,实际Python解决方案相对直接。关键在于生成数组全排列后,通过hour*60+minute计算时间,并使用divmod处理小时和分钟。输出格式的特定要求,如0的填充,也是导致错误的重要因素。正确做法是在遍历完成后,对个位数的小时和分钟添加前导'0',以确保输出格式正确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

太菜了,想了半天没做自己出来这个easy题,下午去翻了翻solution,发现python和我一开始想的差不多,应该是自己搞的过于复杂化了。。。

其实在获得了数组的全排列(共n!种,DFS实现)后,用一个整数time来记录当前有效时间的最大值(这块我看不太懂,用两个即hour和minute来遍历的话是不对的)遍历,注意time是用2个数--即hour*60+minute得到的。之后按照python的divmod语句,应该再将time分别分别除以60和模60,就得到了小时和分钟。

另外还要特别注意输出格式--0的存在,(就是这块让我又WA了几次),因为输出固定是XX:XX样式的,所以我们要考虑存在个位数的情况,代码如下:

class Solution {
public:
	string largestTimeFromDigits(vector<int>& A) {
		string res = "";
		vector<vector<int>>times;
		vector<int>nums;
		int time = -1;

		helper(A, times);

		//比较大小
		for (int i = 0;i < times.size();i++) {
			int hour = times[i][0] * 10 + times[i][1];
			int min = times[i][2] * 10 + times[i][3];
			int tmp = hour * 60 + min;
			if (hour >= 0 && hour < 24 && min >= 0 && min < 60) {
				time = max(time, tmp);
			}
		}

		if (time < 0) {
			return res;
		}

		int hour = time / 60, min = time % 60;

		
		hour < 10 ? res += '0' + to_string(hour) : res += to_string(hour);
		res += ':';
		min < 10 ? res += '0' + to_string(min) : res += to_string(min);

		return res;

	}


	void helper(vector<int>A,vector<vector<int>>&times) {
		vector<vector<int> > res;
		vector<int> out;
		vector<int> visited(A.size(), 0);
		DFS(A, 0, visited, out, times);
		
	}

	void DFS(vector<int> &A, int level, vector<int> &visited, vector<int> &out, vector<vector<int> > &res) {
		if (level == A.size())
			res.push_back(out);
		else {
			for (int i = 0; i < A.size(); ++i) {
				if (visited[i] == 0) {
					visited[i] = 1;
					out.push_back(A[i]);
					DFS(A, level + 1, visited, out, res);
					out.pop_back();
					visited[i] = 0;
				}
			}
		}
	}
};

更正:当遍历完后,小时或分钟为个位数时,先加'0'是因为输出格式固定包括4位数字,且此时在原数组中给出的0通过计算后被“忽略”掉了,因此我们在将其加到数前面,结果仍保持不变。比如当最小的hour和minute为9和3时,应输出 09:03

 

参考:https://leetcode.com/problems/largest-time-for-given-digits/solution/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值