leetcode的一些贪心题目

11-盛最多水的容器

思路:定义2个指针分别指向数组的两端,找出两边缘最小的那个,然后乘以两边缘的距离,然后向中间搜索,移动一次算出结果比较取最大的。

class Solution {
public:
    int maxArea(vector<int>& height) {
        int res=0,i=0,j=height.size()-1;
        while(i<j){
            int h=min(height[j],height[i]);
            res = max(res,h*(j-i));
            while(i<j&&h==height[i]) i++;
            while(i<j&&h==height[j]) j--;
        }
        return res;
    }
};

455-分发饼干

思路:可以先对两个数组进行排序,然后从小到大来一一对应,res+1,第二个数组发现不能满足第一个数组的时候逐步+1,然后用该数组后面的数字来对比。

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort(g.begin(),g.end(),greater<int>());
        sort(s.begin(),s.end(),greater<int>());
        
        int gi=0,si=0,res=0;
        while(gi<g.size()&&si<s.size()){
            
            if(s[si]>=g[gi]){
                res++;
                gi++;
                si++;
            }
            else
                gi++;
        }
        
        return res;
    }
};

392-判断子序列

思路:目前想到的就是两个字符串对比,从前往后遍历一遍,遇到相同的就自增1,逐步遍历一遍后看i是否等于s的长度,且字符都在t中出现过。

class Solution {
public:
    bool isSubsequence(string s, string t) {
        int i=0;
        for(int j=0;j<t.size()&&i<s.size();j++){
            if(s[i]==t[j]) i++;
        }
        return i==s.size();
    }
};

435-无重叠区

思路:先更据每个区间的start进行升序排序,然后更据前一个区间的end是否大于后一个区间的start来进行判断,是则res+1,然后将last指向end值较小的那个区间,没有则指向当前,然后继续遍历。

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        int res = 0, n = intervals.size(), last = 0;
        sort(intervals.begin(), intervals.end());
        for (int i = 1; i < n; ++i) {
            if (intervals[i][0] < intervals[last][1]) {
                ++res;
                if (intervals[i][1] < intervals[last][1]) 
                    last = i;
            } else {
                last = i;
            }
        }
        return res;
    }
};

402

55

12

13

posted @ 2019-10-24 10:12  codeg  阅读(235)  评论(0)    收藏  举报