第三十天打卡,不知不觉已经一个月了!今天的题都是重叠区间的题目,由于之前做过还有印象,这次都是比较快的做出来了,不过第三题不看提示还真的想不到是重叠区间的题目,三题的思路都是更新重叠区间的边界。
452.用最少数量的箭引爆气球
做题过程
- 先把区间左边界按从小到大的顺序排序,遍历的时候更新右边界,当区间与右边界没有重合区间时,更新右边界为区间右边界;当区间与右边界有重合区间时,更新右边界为当前右边界和区间右边界的最小值。
知识点
- 局部最优:当气球出现重叠,一起射,所用弓箭最少。全局最优:把所有气球射爆所用弓箭最少。
贪心算法
class Solution {
public:
static bool cmp(vector<int>&l, vector<int>&r) {
if (l[0] == r[0]) return l[1] < r[1];
return l[0] < r[0];
}
int findMinArrowShots(vector<vector<int>>& points) {
int result = 1;
sort(points.begin(), points.end(), cmp);
int right = points[0][1];
for (int i = 1; i < points.size(); i++) {
if (points[i][0] > right) {
result++;
right = points[i][1];
} else {
right = min(points[i][1], right);
}
}
return result;
}
};
435.无重叠区间
做题过程
- 按左区间排序求出重叠区间的数量,跟射气球很像
贪心算法
class Solution {
public:
static bool cmp(vector<int>& a, vector<int>& b) {
if (a[0] == b[0]) return a[1] < b[1];
return a[0] < b[0];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
int result = 0;
sort(intervals.begin(), intervals.end(), cmp);
int right = intervals[0][1];
for (int i = 1; i < intervals.size(); i++) {
if (intervals[i][0] >= right) {
right = intervals[i][1];
} else {
right = min(right, intervals[i][1]);
result++;
}
}
return result;
}
};
763.划分字母区间
做题过程
- 在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。
- 统计每一个字符最后出现的位置
- 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点
贪心算法
class Solution {
public:
vector<int> partitionLabels(string s) {
vector<int>result;
vector<int>lastIndex(26);
int cur_end = -1;
int pre_end = -1;
for (int i = 0; i < s.size(); i++) {
lastIndex[s[i] - 'a'] = i;
}
for (int i = 0; i < s.size(); i++) {
cur_end = max(cur_end, lastIndex[s[i] - 'a']);
if (i == cur_end) {
result.push_back(cur_end - pre_end);
pre_end = cur_end;
}
}
return result;
}
};
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 代码随想录算法训练营第三十天 | 452. 用最少数量的箭引爆气球,435. 无重叠区间,763.划分字母区间
发表评论 取消回复