算法训练营第三十一天|455.分发饼干、376. 摆动序列、53. 最大子序和

39 阅读1分钟

455. 分发饼干

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int result = 0;
        int idx = s.length - 1; // 用于控制饼干
        for(int i = g.length - 1; i >= 0; i--){ // 遍历胃口
            if(idx >= 0 && s[idx] >= g[i]){
                result++;
                idx--;
            }
        }
        return result;
    }
}

376. 摆动序列

class Solution {
    public int wiggleMaxLength(int[] nums) {
        // 设 dp 状态dp[i][0],表示考虑前 i 个数,第 i 个数作为山峰的摆动子序列的最长长度
        // 设 dp 状态dp[i][1],表示考虑前 i 个数,第 i 个数作为山谷的摆动子序列的最长长度
        int[][] dp = new int[nums.length][2];

        dp[0][0] = dp[0][1] = 1;

        for (int i = 1; i < nums.length; i++){
            //i 自己可以成为波峰或者波谷
            dp[i][0] = dp[i][1] = 1;

            for (int j = 0; j < i; j++){
                if (nums[j] > nums[i]){
                    // i 是波谷
                    dp[i][1] = Math.max(dp[i][1], dp[j][0] + 1);
                }
                if (nums[j] < nums[i]){
                    // i 是波峰
                    dp[i][0] = Math.max(dp[i][0], dp[j][1] + 1);
                }
            }
        }

        return Math.max(dp[nums.length - 1][0], dp[nums.length - 1][1]);
    }
}

53. 最大子数组和

class Solution {
    public int maxSubArray(int[] nums) {
        // dp[i]表示包括i之前的最大连续子序列和
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        int res = nums[0];
        for(int i = 1; i < nums.length; i++){
            dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
            res = Math.max(dp[i], res);
        }
        return res;
    }
}