代码随想录算法训练营 || 贪心算法 455 376 53

Day27

贪心算法基础

  • 贪心的本质是选择每一阶段的局部最优,从而达到全局最优

  • 刷题或者面试的时候,手动模拟一下感觉可以局部最优推出整体最优,而且想不到反例,那么就试一试贪心

  • 做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。

  • 贪心没有套路,说白了就是常识性推导加上举反例

455.分发饼干

力扣题目链接

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

思路

  • 贪心算法,每一次都拿着一个小孩,让这个小孩去吃尺寸最小的饼干,这样能达到全局最优,尽量能喂饱更多的小孩

  • 先把数组进行排序,因为要有序

  • 用index来处理小孩,i来遍历饼干,因为对每个小孩,饼干的尺寸要不断移动

  • 都从最小开始,如果遍历到某个位置饼干能满足小孩,那count++,同时这个小孩被满足了,index++

  • 最后返回count

  • 或者是每一次拿着一个饼干,让这个饼干尽可能满足胃口大的小孩,所以要遍历小孩,找到符合要求的,饼干位置减一

代码

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);//先排序
        int count = 0;//满足的胃口
        int index = 0;//小孩的位置
        for (int i = 0; i < s.length && index < g.length; i++){//饼干进行遍历,因为要看哪个饼干能满足小孩
            if (s[i] >= g[index]){//找到了符合要求的
                count++;
                index++;//小孩位置自增
            }
        }
        return count;
    }
}

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;
    }
}

376. 摆动序列

力扣题目链接

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。

例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。

思路

  • 这个解法很巧妙

  • 先剪枝,如果长度小于2,直接return 1

  • 之后使用up和down进行记录

  • 从1开始遍历,因为要和前一个元素进行比较

  • 如果比前一个大,那up就是down + 1

  • 如果比前一个小,那down就是up + 1

  • 最后返回两者较大值即可

代码

class Solution {
    public int wiggleMaxLength(int[] nums) {
        if (nums.length < 2) return 1;
        int up = 1;
        int down = 1;
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] < nums[i - 1]) down = up + 1;
            if (nums[i] > nums[i - 1]) up = down + 1;
        }
        return Math.max(up,down);
    }
}

53. 最大子序和

力扣题目链接

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

思路

  • 先简单看一下暴力解法

  • 外层循环给出子数组起始位置,内层循环不断遍历后面的元素并更新res

  • 时间复杂度O(n2)

  • 贪心算法

  • 贪心的点在于,计算一个连续和,如果遍历到某个元素,加上这个元素让连续和变为负数了,那我们就把连续和置为0,从下一个元素开始重新计算连续和,因为加上一个负数肯定会让结果变小

代码

class Solution {
    public int maxSubArray(int[] nums) {
        int res = Integer.MIN_VALUE;
        int sum;
        for (int i = 0; i < nums.length; i++){
            sum = 0;
            for (int j = i; j < nums.length; j++){
                sum += nums[j];
                res = Math.max(res,sum);
            }
        }
        return res;
    }
}

class Solution {
    public int maxSubArray(int[] nums) {
        int res = Integer.MIN_VALUE;
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];//加上这个位置的元素
            res = Math.max(res,sum);//这句话要写在前面,否则全是负数的情况会返回0,不断更新res
            if (sum < 0){//如果连续和变为负数了
                sum = 0;//把连续和置为0,继续遍历
            }
        }
        return res;//最后返回res
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值