cpp
class Solution {
public:
static bool cmp(const vector<int> &a,const vector<int> &b){
//邮箱按照身高排列 身高高的在前面 身高相同 第二维小的在前面
//返回一个布尔值,决定 a 是否应该排在 b 之前。
if(a[0]==b[0]){
return a[1]<b[1];
}
return a[0]>b[0];
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
//优先比较身高
sort(people.begin(),people.end(),cmp);
vector<vector<int>> res;
//按照 前面有多少个人大于等于插入
for(int i=0;i<people.size();i++){
res.insert(res.begin()+people[i][1],people[i]);
}
return res;
}
};
思路:贪心思想优先比较 身高 然后按照队列要求插入 这是利用了 二个维度优先比较其中一个维度的原理 ,然后按照顺序插入由于之前插入的都比大于等于 所以只要插入到相应位置一定是对的。
cpp
class Solution {
private:
static bool cmp(const vector<int> &a,const vector<int> &b){
//bool判断想不想a在b前面
return a[0]<b[0];
}
public:
int findMinArrowShots(vector<vector<int>>& points) {
//首先按照起始位置进行排序
sort(points.begin(),points.end(),cmp);
//为了让气球尽可能的重叠,需要对数组进行排序
//如何一次性射最多的弓箭:使得当前得左边界小于等于 最小右边界 最小右边界都能穿到 其他气球都能穿到
if(points.size()==0)
return 0;
int res=1;
int min_right=points[0][1];
for(int i=1;i<points.size();i++){
if(points[i][0]>min_right){
res++;
min_right=points[i][1];
}else{
min_right=min(min_right,points[i][1]);
}
}
return res;
}
};
cpp
class Solution {
public:
// 按照区间右边界排序
static bool cmp (const vector<int>& a, const vector<int>& b) {
return a[1] < b[1]; // 右边界排序
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if (intervals.size() == 0) return 0;
sort(intervals.begin(), intervals.end(), cmp);
int result = 1; // points 不为空至少需要一支箭
for (int i = 1; i < intervals.size(); i++) {
if (intervals[i][0] >= intervals[i - 1][1]) {
result++; // 需要一支箭
}
else { // 气球i和气球i-1挨着
intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]); // 更新重叠气球最小右边界
}
}
//共有多少个重合的区间 剩下的都要被移除
return intervals.size() - result;
}
};
cpp
class Solution {
public:
vector<int> partitionLabels(string s) {
//前面字符串出现的字母不能出现在最后面记录每个字母最后出现的位置 一直更新 找到区间就+1
map<char,int> end;
for(int i=0;i<s.size();i++){
end[s[i]]=i;
}
int now_end=end[s[0]];//目前的最右区间
//找到最右区间就更新下一个区间
int left=0,right=0;//代表当前区间的左右边界 返回result
vector<int> result;
for(int i=0;i<s.size();i++){
//当前right
right=max(right,end[s[i]]);
if(i==right)
{
result.push_back(right-left+1);
left=i+1;
right=0;
}
}
return result;
}
};
思路:从0开始找到最右边界 如果当前最右边界==i 然后找下一个边界