452.用最少数量的箭引爆气球
要点:找重叠区间。如果当前元素的左边界大于前一元素的右边界,说明两元素没有重叠,需要一只箭;如果有重叠,则继续看后一元素,后一元素的左边界大于当前元素和前一元素最小的右边界,说明后一元素跟前两个元素没有重叠,需要一只箭引爆前两个元素。
class Solution {
static bool cmp(const vector<int>& a, const vector<int>& b) {
return a[0] < b[0];
}
public:
int findMinArrowShots(vector<vector<int>>& points) {
int result = 1;
if (points.size() == 1)
return result;
sort(points.begin(), points.end(), cmp);
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], points[i - 1][1]);
}
}
return result;
}
};
435.无重叠区间
要点:与引爆气球类似。如果当前元素的左边界大于等于前一元素的右边界,说明两元素没有重叠区间,不需要统计;如果有重叠区间,统计+1,把当前元素的右边界替换成前两元素的最小右边界,相当于让区间不再重叠。
class Solution {
static bool cmp(const vector<int>& a, const vector<int>& b) {
return a[0] < b[0];
}
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
int result = 0;
if (intervals.size() == 1)
return result;
sort(intervals.begin(), intervals.end(), cmp);
for (int i = 1; i < intervals.size(); i++) {
if (intervals[i][0] >= intervals[i - 1][1]) {
} else {
result++;
intervals[i][1] = min(intervals[i][1], intervals[i - 1][1]);
}
}
return result;
}
};
763.划分字母区间
要点:记录每个字母出现的最远的位置,在一个字母区间里,不可能有字母的最远位置出现在另一个区间里。
class Solution {
public:
vector<int> partitionLabels(string s) {
int hash[27] = {0};
for (int i = 0; i < s.size(); i++) {
hash[s[i] - 'a'] = i;
}
int left = 0, right = 0;
vector<int> result;
for (int i = 0; i < s.size(); i++) {
right = max(hash[s[i] - 'a'], right);
if (i == right) {
result.push_back(right - left + 1);
left = right + 1;
}
}
return result;
}
};