今天是刷题的第二天,引用kuangbin大佬的话
人—我百,人十我万!追逐青春的梦想,怀着自信的心,永不放弃!
虽然可能做不到如此,但希望持续下去。
435. Non-overlapping Intervals(easy)
题目描述
- 这道题的题意很简单,意思是说现在有一系列的区间,让你去掉最少区间使得剩余的区间互不重复,起始和终点不算重叠。
- 输入为一个二维数组,每一行为一个区间,这区间用一个含有两个元素的数组表示,输出是去掉的最少区间数。
策略
- 这题考虑贪心算法,在选择要保留区间时,区间的结尾十分重要:选择的区间结尾越小,余留给其它区间的空间就越大,就越能保留更多的区间。因此,我们采取的贪心策略为,优先保留结尾小且不相交的区间。具体实现方法为,先把区间按照结尾的大小进行增序排序,每次选择结尾最小且和前一个选择的区间不重叠的区间。我们这里使用C++ 的Lambda,Lambda我之前也不是很了解,因此也写了个博客介绍,结合std::sort() 函数进行自定义排序。
代码:
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if(intervals.size()==0){
return 0;
}
sort(intervals.begin(), intervals.end(), [](vector<int>& a, vector<int>& b){
return a[1] < b[1];
});
int ans = 0, prev = intervals[0][1];
for(int i=1;i<intervals.size();++i){
if(intervals[i][0]<prev){
++ans;
}else{
prev = intervals[i][1];
}
}
return ans;
}
};
605. Can Place Flowers(Medium)
题目描述
- 这道题是种花问题,目标是种尽可能多的花。
- 规则是:
1、每个花之间不能相邻 - 输入是花盆数组和n,其中1表示有花,0表示无花,n表示种的花数量,输出为true或false。
策略
- 这题实际上就是求种最多花,当最多种的花数量大于n即可满足true的结果。
- 同样考虑贪心算法,尽可能多种花,则将花种在越前面越好,这样可以使得后面种花的空间更大一些。
代码:
class Solution {
public:
bool canPlaceFlowers(vector<int>& flowerbed, int n) {
int size = flowerbed.size();
for(int i=0;i<size && n>0;i++){
if(flowerbed[i]==0 && (i==0 || flowerbed[i-1]==0) && (i==size-1 || flowerbed[i+1]==0)){
flowerbed[i] = 1;
--n;
++i; // 由于i已经种花,所以i+1的花盆不能种花
}
}
return n==0;
}
};