452. 用最少数量的箭引爆气球
452. 用最少数量的箭引爆气球 - 力扣(LeetCode)
class Solution {
public:
// 求所有重叠空间
static bool cmp(const vector<int> &a, const vector<int> &b){
return a[0] < b[0];
}
int findMinArrowShots(vector<vector<int>>& points) {
sort(points.begin(), points.end(), cmp);
int ans = 1, curLeft = INT_MIN, curRight = INT_MAX; // 记录重叠区间
for(int i = 0; i < points.size(); i++){
if(points[i][0] > curRight){
ans++;
curLeft = points[i][0];
curRight = points[i][1];
continue;
}
curLeft = max(curLeft, points[i][0]);
curRight = min(curRight, points[i][1]);
}
return ans;
}
};
435. 无重叠区间
class Solution {
public:
static bool cmp(vector<int> &a, vector<int> &b){
return a[1] < b[1];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end(), cmp);
int counts = 1, end = intervals[0][1];
for(int i = 1; i < intervals.size(); i++){
if(intervals[i][0] >= end){ // 出现下一个非重叠区间
end = intervals[i][1];
counts++;
}
}
return intervals.size() - counts;
}
};
763.划分字母区间
class Solution {
public:
vector<int> partitionLabels(string s) {
int hash[26]; // 记录每个字母最后出现的位置
for(int i = 0; i < s.size(); i++){
hash[s[i] - 'a'] = i;
}
vector<int> ans;
int lastIndex = 0;
int curMaxIndex = 0;
for(int i = 0; i < s.size(); i++){
curMaxIndex = max(hash[s[i] - 'a'], curMaxIndex); // 统计当前区间内的最大值
if(curMaxIndex == i){
ans.push_back(i - lastIndex + 1);
lastIndex = i + 1; // 记录下一段区间开始的地方
}
}
return ans;
}
};