算法day31 | 贪心:分发饼干、最大子数组和、摆动序列

1. 455. 分发饼干

贪心例子

1.1 链接

https://leetcode.cn/problems/assign-cookies/description/

1.2 关键知识点

局部最优:当前最大饼干给没吃的最大胃口孩子
全局:尽量多孩子吃

1.3 自己遇到的细节问题

  • 应该是遍历孩子,每个孩子只试一遍

1.4 题解

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);//一定要排序
        int num = 0;
        if(g.length == 0 || s.length == 0){
            return num;
        }
        
        for(int i = g.length - 1, j = s.length - 1; i >= 0; i --){//每个孩子只试一遍所以遍历孩子
            if(j >= 0 && g[i] <= s[j]){//j >= 0写在前面
                num++;
                j--;
            }
        }
        return num;
    }
}

2.最大子数组和

  1. 最大子数组和

2.1 链接

https://leetcode.cn/problems/maximum-subarray/description/

2.2 关键知识点

  • 局部最优:当前和为负数时,重置和

2.3 自己遇到的细节问题

int sum = Integer.MIN_VALUE;

2.4 题解

class Solution {
    public int maxSubArray(int[] nums) {
        
        if(nums.length == 1){//注意题目
            return nums[0];
        }
        int sum = 0;
        int max = Integer.MIN_VALUE;
        for(int i = 0; i < nums.length; i ++){
            if(sum < 0){
                sum=nums[i];
            }else{
                sum += nums[i];
            }
            max = Math.max(sum, max); 
        }
        return max;
    }
}

3.摆动序列

3.1 链接

https://leetcode.cn/problems/wiggle-subsequence/discussion/

3.2 关键知识点

  • 重点是满足条件后才更新pre
  • 对于pre等于0的情况加入

3.3 自己遇到的细节问题

3.4 题解

class Solution {
    public int wiggleMaxLength(int[] nums) {
        //if(nums.length == 0 || nums.length == 1){
            //return nums.length;
        //}
        int rs = 1;
        int pre = 0;
        int nxt = 0;
        for(int i = 0; i < nums.length - 1; i ++){
            nxt = nums[i + 1] - nums[i];
            if((pre >= 0 &&  nxt < 0) || (pre <= 0 &&  nxt > 0)){//小于0的
                rs ++;
                pre = nxt;//满足条件再更新
            }
            //pre = nxt;
        }
        return rs;
    }
}

你可能感兴趣的:(算法,数据结构)