给定一个 24 小时制(小时:分钟 "HH:MM")的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
示例 1:
输入:timePoints = ["23:59","00:00"]
输出:1
示例 2:
输入:timePoints = ["00:00","23:59","00:00"]
输出:0
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-time-difference
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
首先对所有时间进行排序,因为是 string类型,直接排序即可。其次,计算出每个时间对应的分钟,那么最小的时间必然出现在两个相邻的时间点。最后,需要特殊处理一下最后一个时间点和第一个时间点之间,可以将第一个时间点+24hour减去最后一个时间点即可.
- /*
- * @lc app=leetcode.cn id=539 lang=cpp
- *
- * [539] 最小时间差
- */
-
- // @lc code=start
- class Solution {
- public:
- int getMinutes(string time){
- int h = stoi(time.substr(0,2));
- int m = stoi(time.substr(3));
- int total = h*60+m;
- return total;
- }
-
- int findMinDifference(vector
& timePoints) { - sort(timePoints.begin(),timePoints.end());
- int n = timePoints.size();
- int cur = getMinutes(timePoints[1]) - getMinutes(timePoints[0]);
- int minn = cur;
- for(int i=1;i
-1;i++){ - int t1 = getMinutes(timePoints[i+1]);
- int t2 = getMinutes(timePoints[i]);
- cur = t1-t2;
- minn = min(minn,cur);
- }
- minn = min(minn, getMinutes(timePoints[0])+1440 - getMinutes(timePoints[n-1]));
- return minn;
- }
- };
- // @lc code=end
-
给你一个由 n 个正整数组成的数组 nums 。
你可以对数组的任意元素执行任意次数的两类操作:
如果元素是 偶数 ,除以 2
例如,如果数组是 [1,2,3,4] ,那么你可以对最后一个元素执行此操作,使其变成 [1,2,3,2]
如果元素是 奇数 ,乘上 2
例如,如果数组是 [1,2,3,4] ,那么你可以对第一个元素执行此操作,使其变成 [2,2,3,4]
数组的 偏移量 是数组中任意两个元素之间的 最大差值 。
返回数组在执行某些操作之后可以拥有的 最小偏移量 。
示例 1:
输入:nums = [1,2,3,4]
输出:1
解释:你可以将数组转换为 [1,2,3,2],然后转换成 [2,2,3,2],偏移量是 3 - 2 = 1
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimize-deviation-in-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
可以发现,偶数除于2可以能为奇数或者偶数,而奇数乘2必然能得到偶数,且除2又可得到本身。所以,换种思路,将所有的数据统一转换成偶数,然后记录最大值和最小值,记录两者之间的差,将最大值除于2,更新最大值和最小值以及差值,直到最大值为奇数为止。这时最大值无法缩小了,就应该考虑最小值变大,思考可以发现:一开始全是偶数,如果最小值是奇数,那么它一定是由上一个偶数除以2变过来的,我们在上一个状态已经计算过这个偶数了,因此没必要扩大他。因此,结束!
- class Solution {
- public:
- int minimumDeviation(vector<int>& nums) {
- priority_queue<int> queue;
- int minn = INT_MAX;
- for(auto&num:nums){
- num = (num&1)?num<<1:num;
- queue.push(num);
- minn = min(minn,num);
- }
- int ans = INT_MAX;
- while(!queue.empty() && !(queue.top()&1)){
- ans = min(ans, queue.top()-minn);
- int cur = queue.top()>>1;
- queue.pop();
- queue.push(cur);
- minn = min(minn,cur);
- }
- ans = min(ans, queue.top() - minn);
- return ans;
- }
- };
总结:
这次笔试全是leetcode原题,但是做的并不是太理想,还是最近手比较生了,多总结吧!多练习!今年秋招真的感觉好难,好好加油!