26.贪心算法4
最少的箭引爆气球
class Solution {
public:
int findMinArrowShots(vector<vector<int>>& points) {
int n=points.size();
int res=1;
sort(points.begin(),points.end(),
[](const vector<int> &a,const vector<int> &b){
return a[0]<b[0];
}
);
for(int i=1;i<n;i++){
if(points[i-1][1]>=points[i][0]){
if(points[i-1][1]<points[i][1])
points[i][1]=points[i-1][1];
continue;
}
res++;
}
return res;
}
};
无重叠区间
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& points) {
int n=points.size();
int res=1;
sort(points.begin(),points.end(),
[](const vector<int> &a,const vector<int> &b){
return a[0]<b[0];
}
);
for(int i=1;i<n;i++){
if(points[i-1][1]>points[i][0]){
if(points[i-1][1]<points[i][1])
points[i][1]=points[i-1][1];
continue;
}
res++;
}
return n-res;
}
};
和上一题代码几乎一模一样,除了开闭区间和结果返回
切割字符串
class Solution {
public:
vector<int> partitionLabels(string s) {
unordered_map<char,vector<int>> interns;
for(int i=0;i<s.size();i++){
if(interns[s[i]].empty()){
interns[s[i]]=vector<int>(2,0);
interns[s[i]][0]=interns[s[i]][1]=i;
}else {
interns[s[i]][1]=i;
}
}
vector<pair<char,vector<int>>> vec(interns.begin(),interns.end());
sort(vec.begin(),vec.end()
,[](const pair<char,vector<int>>& a,const pair<char,vector<int>>& b ){
return a.second[0]<b.second[0];
}
);
vector<int> res;
int cur=0;
for(int i=1;i<vec.size();i++){
if(vec[i].second[0]>vec[i-1].second[1]){
res.push_back(vec[i-1].second[1]-cur+1);
cur=vec[i].second[0];
}else if(vec[i].second[1]<vec[i-1].second[1]){
vec[i].second[1]=vec[i-1].second[1];
}
}
res.push_back(s.size()-cur);
return res;
}
};
上面那种做法太冗余了,我们需要的信息其实只有结尾
class Solution {
public:
vector<int> partitionLabels(string S) {
int hash[27] = {0}; // i为字符,hash[i]为字符出现的最后位置
for (int i = 0; i < S.size(); i++) { // 统计每一个字符最后出现的位置
hash[S[i] - 'a'] = i;
}
vector<int> result;
int left = 0;
int right = 0;
for (int i = 0; i < S.size(); i++) {
right = max(right, hash[S[i] - 'a']); // 找到字符出现的最远边界
if (i == right) {
result.push_back(right - left + 1);
left = i + 1;
}
}
return result;
}
};