452. 用最少数量的箭引爆气球 - 力扣(LeetCode)
这题是一个区间题,不过要求我们求最小的弓箭数,显然我们可以先进行排序,然后挨个比较气球的区间,如果两个气球的区间没有交集则弓箭数加一,如果有的话我们需要更新后一个气球的区间(因为我们必须在两个气球重叠的位置射箭才能满足要求)。
class Solution {
public:int findMinArrowShots(vector<vector<int>>& points) {int res=1;sort(points.begin(),points.end());for(int i=1;i<points.size();++i){if(points[i][0]>points[i-1][1]){++res;}else points[i][1]=min(points[i][1],points[i-1][1]);}return res;}
};
435. 无重叠区间 - 力扣(LeetCode)
这题要求我们移除最少的区间达到不重叠的效果,那么显然我们需要先对已有的集合进行排序才方便移除区间,除此之外我们还需要做的是维护一个当前的最右值,一旦发现后续的元素小于这个最右值我们就移除这个区间即可,这也就是我们的贪心思想的体现。
class Solution {
public:bool static cmp(const vector<int>& a,const vector<int>& b){return a[1]<b[1];}int eraseOverlapIntervals(vector<vector<int>>& intervals) {sort(intervals.begin(), intervals.end(),cmp);int res=0,end=intervals[0][1];for(int i=1;i<intervals.size();++i){if(intervals[i][0]<end)++res;else end=intervals[i][1];}return res;}
};
763. 划分字母区间 - 力扣(LeetCode)
这个题要求我们把一个字符串划分为尽可能多的区间的同时一个字母只允许出现在一个区间中,那么我们可以反过来利用这一点,记录每一个字母最后出现的位置,然后以此为划分区间的依据即可。
class Solution {
public:vector<int> partitionLabels(string s) {int last[26];for(int i=0;i<s.size();++i){last[s[i]-'a']=i;}int start=0,end=0;vector<int> res;for(int i=0;i<s.size();++i){end=max(end,last[s[i]-'a']);if(end==i){res.push_back(end-start+1);start=i+1;}}return res;}
};