435 无重叠区间
题目链接:无重叠区间
思路
这道题目和昨天最后一道射弓箭的题目很相似。我们找到重叠的区域有几个,那也就是要移除几个区域后剩下的区域不重叠。所以这道题目可以变为找重叠区域的问题。
class Solution {
public:static bool cmp(const vector<int>a, const vector<int> b){return a[0] < b[0];}int eraseOverlapIntervals(vector<vector<int>>& intervals) {sort(intervals.begin(), intervals.end(), cmp);int count = 0;int end = intervals[0][1];for(int i=1; i<intervals.size(); i++){if(intervals[i][0] >= end) // 不重叠的情况{end = intervals[i][1];}else{ // 重叠的情况, 还要判断是否与第三个区间重叠end = min(intervals[i][1], end);count++;}}return count;}
};
763 划分字母区间
题目链接:划分字母区间
思路
这道题目没有一点想法。参考解析,找出每个字母的最大下标,然后根据这个最大下标,不断去更新右边界,总能找到某个字符的最大下标满足左边的字母的最大下标都小于这个下标,然后将这个长度存起来,就是一个符合要求的字符串。同时对左边界进行更新。
class Solution {
public:vector<int> partitionLabels(string s) {int h[26] = {0};for(int i=0; i<s.size(); i++){h[s[i]-'a'] = i; // 每个字母的最大下标}int left=0;int right=0;vector<int> res;for(int i=0; i<s.size(); i++){right = max(right, h[s[i]-'a']); // 不断更新右边界if(i == right){res.push_back(right - left + 1);left = i + 1;}}return res;}
};
56 合并区间
题目链接:合并区间
思路
这道题目的思路以及解法和前面几道题目非常相似。也是找重叠区间,遇见重叠区间则进行合并即可(也就是更新右边界);遇见不重叠的区域则直接添加到结果里。
class Solution {
public:static bool cmp(const vector<int>a, const vector<int>b){return a[0] < b[0]; // 左边界从小到大排序}vector<vector<int>> merge(vector<vector<int>>& intervals) {sort(intervals.begin(), intervals.end(), cmp);vector<vector<int>> res;res.push_back(intervals[0]);for(int i=1; i<intervals.size(); i++){if(intervals[i][0] <= res.back()[1]) // 出现重叠{res.back()[1] = max(res.back()[1], intervals[i][1]);}else{res.push_back(intervals[i]);}}return res;}
};
参考链接
- https://programmercarl.com/0056.%E5%90%88%E5%B9%B6%E5%8C%BA%E9%97%B4.html#%E6%80%9D%E8%B7%AF