day27 贪心算法-基础+发饼干+摆动序列+最大子序和

## 8. Greedy

### 8.1 introduction
核心:通过局部最优达到全局最优。

### 8.2 455. Assign Cookies
Assume you are an awesome parent and want to give your children some cookies. But, you should give each child at most one cookie.
Each child i has a greed factor g[i], which is the minimum size of a cookie that the child will be content with; and each cookie j has a size `s[j]. If s[j] >= g[i], we can assign the cookie j to the child i, and the child i will be content. Your goal is to maximize the number of your content children and output the maximum number.
https://leetcode.cn/problems/assign-cookies/description/
https://programmercarl.com/0455.%E5%88%86%E5%8F%91%E9%A5%BC%E5%B9%B2.html  
用大饼干满足大馋孩子/用小饼干满足小孩子


### 8.3 376. Wiggle Subsequence
A wiggle sequence is a sequence where the differences between successive numbers strictly alternate between positive and negative. The first difference (if one exists) may be either positive or negative. A sequence with one element and a sequence with two non-equal elements are trivially wiggle sequences.
For example, `[1, 7, 4, 9, 2, 5] is a wiggle sequence because the differences (6, -3, 5, -7, 3) alternate between positive and negative.
In contrast, `[1, 4, 7, 2, 5] and [1, 7, 4, 5, 5] are not wiggle sequences. The first is not because its first two differences are positive, and the second is not because its last difference is zero.
A subsequence is obtained by deleting some elements (possibly zero) from the original sequence, leaving the remaining elements in their original order.
Given an integer array nums, return the length of the longest wiggle subsequence of nums. 
https://leetcode.cn/problems/wiggle-subsequence/
https://programmercarl.com/0376.%E6%91%86%E5%8A%A8%E5%BA%8F%E5%88%97.html  
删除单调坡上的元素。操作上遇到摆动就++即可。
特殊情况:
1.上下坡中有平坡
2.首尾元素:虚拟头节点+默认尾部有摆动。
3.单调坡中有平坡
```java
public class wiggleSubsequence {  
    public int wiggleMaxLength(int[] nums) {  
        if(nums.length <= 1)return nums.length;  
  
        int preDifference = 0;  
        int curDifference = 0;  
        //头节点算上,不遍历它  
        int result = 1;  
        for (int i = 1; i < nums.length; i++) {  
            curDifference = nums[i] - nums[i-1];  
            if((preDifference >= 0 && curDifference < 0)||(preDifference <= 0 && curDifference > 0)){  
                result++;  
                preDifference = curDifference;  
            }  
        }  
        return result;  
    }  
}  
class wiggleSubsequenceTest {  
    public static void main(String[] args) {  
        int[] nums = {1,17,5,10,13,13,13,15,10,5,16,8};  
        wiggleSubsequence example = new wiggleSubsequence();  
        System.out.println(example.wiggleMaxLength(nums));  
    }  
}
```
### 8.4 53. Maximum Subarray
Given an integer array nums, find the subarray with the largest sum, and return its sum.
https://leetcode.cn/problems/maximum-subarray/
https://programmercarl.com/0053.%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C.html  
当连续和是负数的时候,就抛弃
要随时保存最大值。
```java
public class maxSubarray {  
    public int maxSubArray(int[] nums) {  
        int cur = 0;  
        int result = Integer.MIN_VALUE;  
        for (int i = 0; i < nums.length; i++) {  
            cur += nums[i];  
            result = Math.max(cur,result);  
            if(cur < 0) cur = 0;  
        }  
        return result;  
    }  
}
```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值