代码随想录算法训练营 |贪心算法:part03|根据身高重建队列、最少数量的箭引爆气球、无重叠区域
·
860. 柠檬水找零 - 力扣(LeetCode)//简单。贪心在于遇到20美元优先找10美元和5美元即可。
406. 根据身高重建队列 - 力扣(LeetCode)//中等。很巧妙的思想。
class Solution {
public:
//bool cmp(const Type& a, const Type& b) {
// 如果 a 应该排在 b 前面,返回 true;
// 否则返回 false。
static bool cmp(vector<int>& a,vector<int>& 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);//先从身高到低排序
list<vector<int>> que;
for(int i=0;i<people.size();i++){
int position=people[i][1];//插入位置,即第i个人的前面应该有多少个比他高的
auto it = que.begin();//指针指向头节点
while(position--){
it++;//往后不断插入
}
que.insert(it,people[i]);//插入的时候,假设第i个元素,那么他前面插入了i-1个元素都比他大,所以[i][1]的值不可能超出i-1;
}
return vector<vector<int>> (que.begin(),que.end());
}
};
452. 用最少数量的箭引爆气球 - 力扣(LeetCode)//中等。先按第一位元素的大小排序。然后箭头贪心的选择最右端点。如果新的节点的左端点超出原来的右端点,就加一条箭。
class Solution {
public:
static bool cmp(const vector<int>& a,const vector<int>& b){
if(a[0]==b[0]) return a[1]>b[1];
return a[0]<b[0];
}
int findMinArrowShots(vector<vector<int>>& points) {
sort(points.begin(),points.end(),cmp);
int result=1;int end=points[0][1];
for(int i=1;i<points.size();i++){
if(end>=points[i][0]){
end=min(points[i][1],end);
}
else {
end=points[i][1];
result++;
}
}
return result;
}
};
435. 无重叠区间 - 力扣(LeetCode)//中等。这题正好和上题相反,所以把上一题的代码抄下来,把if条件内的大于等于改为大于(因为[1,2]和[2,3]算不重叠)。最后return 数组size()-result即可。。。
class Solution {
public:
static bool cmp(const vector<int>& a,const 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 result=1;int end=intervals[0][1];
for(int i=1;i<intervals.size();i++){
if(end>intervals[i][0]){
end=min(intervals[i][1],end);
}
else {
end=intervals[i][1];
result++;
}
}
return intervals.size()-result;
}
};
更多推荐

所有评论(0)