Day2-LeetCode刷题(贪心算法练习及区间问题)

今天是刷题的第二天,引用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;
    }
};

猜你喜欢

转载自blog.csdn.net/Geek_/article/details/113503270