452. 用最少数量的箭引爆气球
思路:重叠区间,先对数组中的数据进行排序,这里是按第一个元素进行了排序。从左边第二个元素开始,如果该元素的第一个数字小于前一个元素的第二个数字,则说明两个气球出现了重叠。至于判断下一个气球是否和前两个重叠的方法,便是将当前元素的第二位数字改为该元素的第二位数字和前一个元素的第二位数字的最小值,之后进行正常比较即可。对重叠次数进行统计,最后返回重叠次数。
class Solution {
public:
// 重写compare函数
static bool compare(vector<int>& a, vector<int>& b) { return a[0] < b[0]; }
int findMinArrowShots(vector<vector<int>>& points) {
if(points.size()==0) return 0;
// 重点:更新右边界
int result = 1;//如果气球数不为零则至少需要一支箭
sort(points.begin(),points.end(),compare);
for(int i =1;i<points.size();i++){
if(points[i][0]>points[i-1][1]) result++;
else{
points[i][1]=min(points[i-1][1],points[i][1]);
}
}
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) {
sort(intervals.begin(),intervals.end(),cmp);
int del = 0;
int n = intervals.size();
for(int i=1;i<n;i++){
if(intervals[i][0]<intervals[i-1][1]){
del++;
intervals[i][1]=min(intervals[i][1],intervals[i-1][1]);
}
}
return del;
}
};
763.划分字母区间
思路:为了保证每一个字母都在一个区间内,我们首先需要遍历字符串,记录每个字母最后出现的位置,将下表存入哈希表中。然后再次遍历字符串,当访问到一个元素时,看他的最大下标是否大于当前存储的区间末尾的最大下标,如果大于则替换末尾的最大下标(这里末尾最大下标指的是该区间到什么位置结束),最后当i等于当前的最大下标时,存储这个区间,然后继续向后遍历,直到结束。
class Solution {
public:
vector<int> partitionLabels(string s) {
unordered_map<int,int> hash;
//求出每个字母的最后出现位置
for(int i=0;i<s.size();i++){
hash[s[i]-'a']=i;
}
int left = 0;
int right = 0;
vector<int> ans;
for(int i = 0;i<s.size();i++){
right=max(right,hash[s[i]-'a']);
if(i==right){
ans.push_back(right-left+1);
left=i+1;
}
}
return ans;
}
};