LeetCode Day31 455&376&53

59 阅读1分钟
455. 分发饼干

先用排序把胃口和饼干数组都分别排序好,这样做的目的是我们需要按照胃口的大小去分配饼干。为了不浪费,那么最优的做法应该用最大的饼干去喂能满足的最大的胃口,依次遍历下去。那么这里就需要一个index作为饼干数组的末尾下标(那么s[index]指向的就是最大份的饼干),写判断条件的时候需要注意判断里面index>=0这一条件以避免数组越界。代码如下:

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int index = s.length - 1;
        int res = 0;
        for(int i = g.length - 1; i >= 0; i --){
            if(index>=0 && s[index] >= g[i]){
                index --;
                res ++;
            }
        }

        return res;
    }
}
376. 摆动序列

这题可以用dp做,如果用贪心做的话写完发现代码挺少的但要注意的地方还是蛮多的。题目说要求摆动序列,那么当我们把数字序列大小画出来可以发现,其实就是求这组数列里面如何选出最多个完整的波峰,因为只要出现波峰,就说明俩数之间存在差值,即是题设要求的数组。

class Solution {
    public int wiggleMaxLength(int[] nums) {
        if(nums.length <= 1) return nums.length;

        int count = 1;
        int curDiff = 0;
        int preDiff = 0;
        for(int i = 1; i < nums.length; i ++){
            curDiff = nums[i] - nums[i - 1];
            //如果出现差值摆动才要更新上一个波峰的差值
            if((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)){
                count ++;
                preDiff = curDiff;
            }
            //假设上一任的波峰差值是实时更新的,也就是无论是否出现差值都更新,那么当出现平峰时就有可能影响结果
            //preDiff = curDiff;
        }

        return count;
    }
}
53. 最大子数组和
class Solution {
    public int maxSubArray(int[] nums) {
        if (nums.length == 1){
            return nums[0];
        }
        int result = Integer.MIN_VALUE;
        int count = 0;
        for(int i = 0; i < nums.length; i ++){
            count += nums[i];
            result = Math.max(result, count);
            if(count <= 0) count = 0;
        }

        return result;
    }
}