力扣刷题笔记 贪心篇

总结先放在前面:

贪心的本质是选择每一阶段的局部最优,从而达到全局最优。

解答贪心时的一些小技巧与注意点:

1.贪心问题在需要多维度进行考虑时,可以先从某一个维度开始贪心,然后再从另一个,比如NO.135. 分发糖果中,既需要考虑左边孩子的糖果数又需要考虑右边孩子的糖果数,我们先从左往右保证右边一定大于左边,再从右往左保证左边一定大于右边(注意次数需要对比一下两次遍历中糖果数可能会不同,不同时需要去较大的那个)即可。

题目实战

1.NO.455. 分发饼干

力扣刷题笔记 贪心篇_第1张图片

public class Solution {
   
    public int FindContentChildren(int[] g, int[] s) {
   
        //应该先满足那些胃口最小,并且使用最小尺寸的饼干来喂
        quickSort(g,0,g.Length-1);
        quickSort(s,0,s.Length-1);
        int max=0;
        int i=0;
        int j=0;
        while(i<g.Length&&j<s.Length){
   
            if(g[i]<=s[j]){
   
                i++;
                j++;
                max++;
            }
            else if(g[i]>s[j]){
   
                j++;
            }
        }
        return max;
    }



   /*
     * 快速排序
     *
     * 参数说明:
     *     a -- 待排序的数组
     *     l -- 数组的左边界(例如,从起始位置开始排序,则l=0)
     *     r -- 数组的右边界(例如,排序截至到数组末尾,则r=a.length-1)
     */
    public void quickSort(int[] a, int l, int r) {
   

        if (l < r) {
   
            int i,j,x;

            i = l;
            j = r;
            x = a[i];
            while (i < j) {
   
                while(i < j && a[j] > x){
   
                    j--;
                } // 从右向左找第一个小于x的数
                if(i < j){
   
                    a[i++] = a[j];
                }
                while(i < j && a[i] < x){
   
                    i++;
                } // 从左向右找第一个大于x的数
                if(i < j){
   
                    a[j--] = a[i];
                }
                   
            }
            a[i] = x;
            quickSort(a, l, i-1); /* 递归调用 */
            quickSort(a, i+1, r); /* 递归调用 */
        }
    }
}

在这里插入图片描述

2.NO.376. 摆动序列

力扣刷题笔记 贪心篇_第2张图片

public class Solution {
   
    public int WiggleMaxLength(int[] nums) {
   
        return myWiggleMaxLength(nums,0,0,1)+1;
    }

    public int myWiggleMaxLength(int[] nums, int cur, int pre, int nxt){
   
        //nums[]是原数组,cur指当前处理的元素,pre指之前的是正还是负,1表示之前是增加,-1表示之前是减少,0表示前面为0,nxt表示接下来要对比的数
        if(nxt>=nums.Length){
   
            return 0;
        }

        if(nums[cur]>nums[nxt]){
   
            if(pre==

你可能感兴趣的:(leetcode)