贪心算法:
1.3 区间问题
题目描述
给定多个区间,计算让这些区间互不重叠所需要移除区间的最少个数。起止相连不算重叠
输入输出样例
题目解析:
首先将所有的区间按照第二个数字的额大小顺序进行排列,,然后对比每个区间的第一个数据看是否小于区间的第二个数据,如果有相交,则跳过该区间,如果不相交则保留。
1.判断是否为空,如果是空的话,返回0
if(intervals.empty())
{return 0;}
2.使用排序函数进行排序sort(intervals.begin(),intervals.end(),[](vector<int>a,vector<int>b)){
return a[1]>b[1]}
3.进行比较,逐一进行 n=intervals.size();
int total=0//统计需要删除的数量,prev=intervals[0][1];//从第一个数据的第二个开始
for(int i=1;i<n;++i){if(intervals[i][0]<prev)
{++total;
}else prev=[i][1];
}return total;
更加通俗的理解:首先prev=2;i=1时,intervals=1,1<2 ,total=1;i=2时interval=2<3
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if(intervals.empty())
{
return 0;
}
sort(intervals.begin(),intervals.end(),[](vector<int>a,vector<int>b)
{
return a[1]<b[1];
});
int n=intervals.size();
int total=0,prev=intervals[0][1];
for(int i=1;i<n;i++)
{
if(intervals[i][0]<prev)
{
total++;
}
else{
prev=intervals[i][1];
}
}
return total;
}
};
种花问题(605)
题目描述:
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false。
题目解答:
如果想要插入1个花朵,就需要中间有三个0,也就是10001.
只需要满足在a[i]=0,a[i+1]=0,a[i-1]=0或者边界情况,a[i]=0,i-1为0,a[i+1]=0,或者a[i]=0,a[i-1]=0,i+1=a,size();
满足其中之一,就另a[i]为1,继续进行循环
class Solution {
public:
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
int total=flowerbed.size();
int res=0;
for(int i=0;i<total;i++)
{
if(!flowerbed[i] && (!flowerbed[max(0 , i - 1)] && !flowerbed[min(total - 1 , i + 1)]))
{
flowerbed[i]=1;
res++;
}
}
return res>=n;
}
};