算法修炼Day31|● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

61 阅读1分钟

LeetCode:455. 分发饼干 - 力扣(LeetCode)

1.思路

从胃口或饼干大小两个角度中的一个去考虑

方法一:优先考虑饼干,小饼干满足小胃口。

方法二:优先考虑胃口,大胃口对应大饼干。

2.代码实现
class Solution {

    // 优先考虑饼干,小饼干先喂小胃口
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int start = 0; // 
        int count = 0;
        for (int i = 0; start < g.length && i < s.length; i++) {
            if (g[start] <= s[i]) {
                count++;
                start++;
            }
        }
        return count;
    }
}

class Solution {
    // 优先考虑胃口,大胃口对应大饼干。
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int start = s.length - 1;
        int count = 0;
        for (int i = g.length - 1; i >= 0 && start >= 0; i--) {
            if (s[start] >= g[i]) {
                count++;
                start--;
            }
        }
        return count;
    }
}
3.复杂度分析

时间复杂度:O(nlogn).

空间复杂度:O(n).

LeetCode:376. 摆动序列 - 力扣(LeetCode)

1.思路

极值思维,当节点数为1时,直接返回1;节点数为2时判断是否相同,不相同,返回2,相同返回1。3个及以上的数时有三种情况,单调递增或单调递减,有增有减,递增或递减中有平坡。

2.代码实现
class Solution {
    public int wiggleMaxLength(int[] nums) {
        if (nums.length == 1) return 1;
        int prediff = 0;
        int curdiff = 0;
        int result = 1;
        for (int i = 0; i < nums.length - 1; i++) {
            curdiff = nums[i + 1] - nums[i];
            // 一正一负为拐点
            if ((prediff >= 0 && curdiff < 0) || (prediff<= 0 && curdiff > 0)) {
                result++;
                prediff = curdiff; // 当产生拐点时再进行赋值
            }
        }
        return result;
    }
}
3.复杂度分析

时间复杂度:O(n).

空间复杂度:O(1).

LeetCode:

1.思路

做一个标记值count,如果sum+nums[i]<0则归零count=0。

2.代码实现
class Solution {
    public int maxSubArray(int[] nums) {
        if (nums.length == 1) {
            return nums[0];
        }
        int sum = Integer.MIN_VALUE; // 整型最小值10位
        int count = 0; // sum + nums[i]小于0时舍弃
        for (int i = 0; i < nums.length; i++) {
            count += nums[i];
            sum = Math.max(sum, count);
            if (count <= 0) {
                count = 0;
            }
        }
        return sum;
    }
}
3.复杂度分析

时间复杂度:O(n).

空间复杂度:O(1).