当前位置:   article > 正文

leetcode(hot100)——贪心算法

leetcode(hot100)——贪心算法

55. 跳跃游戏

        本题不用纠结于可以跳几步,可以聚焦于覆盖范围,即 当前位置+当前跳数 能够覆盖的范围,若这个范围足以到达最后一个位置,则返回true;若for循环结束,则还没返回true,则返回false。 下面看代码:

  1. class Solution {
  2. public boolean canJump(int[] nums) {
  3. if(nums.length == 1) return true;
  4. int cover = 0;
  5. for(int i=0; i<=cover; i++){
  6. cover = Math.max(cover,i+nums[i]);
  7. if(cover >= nums.length-1){
  8. return true;
  9. }
  10. }
  11. return false;
  12. }
  13. }

因为cover是覆盖范围,所以for循环的终止条件是i<=cover,最后一个位置是可以取到的。

45. 跳跃游戏 II 

        本题为 跳跃游戏I 的升级版,保证可以到达终点的情况下,要求出最短的跳跃次数。

        还是仿照 跳跃游戏I 的思路,定义一个cover 用于记录最大覆盖范围,终止条件是:        cover >= nums.size()-1  ,还要定义一个变量 largest 用于记录当前最远覆盖范围的下标,当i遍历到 largest 时,就要开始新的一步,即ans++。

  1. class Solution {
  2. public int jump(int[] nums) {
  3. if(nums.length == 1) return 0;
  4. int cover = 0;
  5. int ans = 0;
  6. int largest = 0;
  7. for(int i=0; i<nums.length; i++){
  8. cover = Math.max(cover , nums[i]+i);//最大覆盖范围
  9. if(cover >= nums.length-1){ //终止条件
  10. return ans+1;
  11. }
  12. if(largest == i){ //需要开始新的一步
  13. ans++;
  14. largest = cover;
  15. }
  16. }
  17. return ans+1;
  18. }
  19. }

455. 分发饼干

        优先将大饼干喂给胃口大的,尽可能先把大胃口的孩子满足,此时for循环需要遍历胃口。 下面看代码:

  1. class Solution {
  2. public int findContentChildren(int[] g, int[] s) {
  3. int ans = 0;
  4. int j = s.length-1;
  5. Arrays.sort(g);
  6. Arrays.sort(s);
  7. for(int i=g.length-1; i>=0; i--){
  8. //没有越界 且 饼干尺寸大于胃口
  9. if(j>=0 && s[j]>=g[i]){
  10. ans++;
  11. j--;
  12. }
  13. }
  14. return ans;
  15. }
  16. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/773377
推荐阅读
相关标签
  

闽ICP备14008679号