前言
跟着英雄哥打卡第三十七天
[专题跳转->《算法零基础100讲》]
[万人千题社区跳转]
一、最小时间差
跳转力扣:539. 最小时间差
难度:★☆☆☆☆
说明:排序,同类型高精度问题可参考 [解题报告] 《算法零基础100讲》(第27讲) 字符串算法(七) - 高精度
三、最小时间差
代码如下(示例):
class Solution {
public:
int minute(string s) {
return (s[0] - '0') * 600 + (s[1] - '0') * 60 + (s[3] - '0') * 10 + (s[4] - '0');
}
int findMinDifference(vector<string>& timePoints) {
if (timePoints.size() > 1440)
return 0;
vector<int> time(timePoints.size());
for (int i = 0; i < timePoints.size(); i ++) {
time[i] = minute(timePoints[i]);
}
sort(time.begin(), time.end());
int minn = INT_MAX;
for (int i = 1; i < time.size(); i ++) {
minn = min(minn, time[i] - time[i - 1]);
if (minn == 0)
return 0;
}
return min(minn, 1440 + time[0] - time[time.size() - 1]);
}
};
二、有序数组的平方
跳转力扣:977. 有序数组的平方
难度:★☆☆☆☆
说明:排序,双指针,找到平方后最大的值放在数组最后面,从后往前赋值
代码如下(示例):
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> q(nums.size());
int l = 0, r = nums.size() - 1, p = nums.size() - 1;
while (l <= r) {
if (nums[l] * nums[l] > nums[r] * nums[r])
q[p --] = nums[l] * nums[l ++];
else
q[p --] = nums[r] * nums[r --];
}
return q;
}
};
三、优势洗牌
跳转力扣:870. 优势洗牌
难度:★★☆☆☆
说明:排序,大根堆,将B数组存入堆中,并将A升序排序,用堆中最大值与A数组最大值作比较,若数组A最大值(max(A))优势大于堆中最大值(max(B)),则满足条件,可将该最大值赋值到对应下标的位置,若不满足要求,则将数组A最小值赋值到对应下标位置(田忌赛马思路,将本方(数组A)最小的数与对方(数组B)最大的数匹配),以实现优势损失最小化。
代码如下(示例):
typedef pair<int, int> pii;
class Solution {
public:
vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {
vector<int> ans(nums1.size());
sort(nums1.begin(), nums1.end());
priority_queue<pii> heap;
for (int i = 0; i < nums2.size(); i ++)
heap.push({nums2[i], i});
int l = 0, r = nums2.size() - 1;
while (!heap.empty() && l <= r) {
auto t = heap.top();
heap.pop();
if (t.first < nums1[r]) {
ans[t.second] = nums1[r --];
}
else
ans[t.second] = nums1[l ++];
}
return ans;
}
};
四、救生艇
跳转力扣:881. 救生艇
难度:★★☆☆☆
说明:排序,双指针,若某人体重已超过 l i m i t limit limit 限制,则直接跳过,体重最小与最大的两个人体重相加不超过 l i m i t limit limit乘坐同一艘艇,否则一人乘一艘艇
代码如下(示例):
class Solution {
public:
int numRescueBoats(vector<int>& people, int limit) {
sort(people.begin(), people.end());
int l = 0, r = people.size() - 1, ans = 0;
while (l <= r) {
if (people[r] > limit)
r --;
else if (people[l] + people[r] > limit) {
r --;
ans ++;
}
else {
l ++, r --;
ans ++;
}
}
return ans;
}
};