代码随想录第三十一天

代码随想录第三十一天

    • Leetcode 455. 分发饼干
    • Leetcode 376. 摆动序列
    • Leetcode 53. 最大子数组和

Leetcode 455. 分发饼干

题目链接: 分发饼干
自己的思路:自己做出来的(虽然很简单)!局部最优推全局最优,局部最优为让大的饼干给胃口大的孩子吃,思路就是尽量让大的饼干喂大胃口的小孩子,定义一个index来控制饼干的移动!

正确思路:

代码:

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        //数组排序
        Arrays.sort(g);
        Arrays.sort(s);
        int count = 0;
        int index = s.length-1;
        for (int i=g.length-1;i>=0;i--){
            //满足条件则投喂
            if(index>=0&&s[index]>=g[i]){
                count++;
                index--;
            }
        }
        return count;
    }
}

复杂度分析
时间复杂度: O ( n ⋅ m ) \mathcal{O}(n\cdot m) O(nm)
空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)

Leetcode 376. 摆动序列

题目链接: 摆动序列
自己的思路:没想出来,一开始题目就理解错了!

正确思路:从局部最优推全局最优,局部最优就是去掉中间的单调坡和平坡;思路:定义两个变量pre和cur,pre表示当前点的前一个坡度,cur表示当前点的后一个坡度,一共有三种情况,一种是一直在震动,一种是先向上(向下)然后平坡最后向下(向上),最后一种是先单调再平坡,第一种情况不用说,就是判断前一个坡度和下一个坡度是否是异号,第二种情况和第三种情况都将平坡的排除掉,当出现震动的时候才将pre赋值为cur!!!

代码:

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

        //第一个元素默认为一个单位长度
        int result = 1;
        int pre =0;
        int cur = 0;
        for (int i =1;i<nums.length;i++){
            cur=nums[i]-nums[i-1];
            //出现摆动
            if (cur>0&&pre<=0||cur<0&&pre>=0){
                result++;
                //当出现摆动的时候,才赋予pre为cur
                //避免单调平坡的情况
                pre = cur;
            }
        }
        return result;
    }
}

复杂度分析
时间复杂度: O ( n ) \mathcal{O}(n) O(n)
空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)

Leetcode 53. 最大子数组和

题目链接: 最大子数组和
自己的思路:之前做过一遍,但是还是不会做!!!

正确思路:局部最优推全局最优,局部最优就是当当前的和为负数的时候,舍弃掉当前和,令其为0,因为如果为负数只会’拖累’掉后面的数,而且为了避免一个正数后面出现一堆负数,但是加起来还为正数的情况,我们使用一个变量为记录每一个子数组的最大和,最后返回这个最大和即可!!!

代码:

class Solution {
    public int maxSubArray(int[] nums) {
        int result = 0;
        int sum = Integer.MIN_VALUE;
        for (int i =0;i<nums.length;i++){
            result += nums[i];
            //sum记录最大值
            if (result>sum) sum=result;
            //当当前连续和小于0的时候,赋值为0
            if (result<0) result=0;
        }
        return sum;
    }
}

复杂度分析
时间复杂度: O ( n ) \mathcal{O}(n) O(n)
空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)

你可能感兴趣的:(排序算法,算法)