贪心算法的基本思想(Greedy Algorithm)

本文介绍了贪心算法的基本概念,其通过局部最优决策逐步逼近全局最优解。以跳跃游戏为例,展示了如何通过贪心法分析问题并给出Java代码实现。
摘要由CSDN通过智能技术生成

一、贪心算法简介

贪心算法:英文全称:Greedy Algorithm,基本思想是在解决最优解的问题时,将求解过程分为若干个步骤,每个步骤都应用贪心原则,选取当前状态下最好/最优的选择(局部最有利的选择),并且希望此选择最后累积的结果也是最优的解,问题的最优解是由子问题的最优解堆叠而来的

顾名思义,贪心法好像一个贪婪的人,处于当前的这个阶段,他做出的选择都是当前他能看到的最好的选择,贪图眼前利益的最大化,完全不顾未来会怎么样,但贪心算法要求眼前利益最优,最终问题利益也最优。

二、贪心法的基本步骤

  1. 从某个初始解出发

  2. 采用迭代的过程,当可以向目标前进一部时,就根据局部最优策略,得到一部份解,缩小问题规模

  3. 将所有解综合起来

三、贪心法的经典问题

问题一:跳跃游戏

题目描述:

给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度,判断你是否能够到达最后一个位置。

示例1:

输入:[2,3,1,1,4]
输出:true
​
解释:初始位于下标为0的位置,num[0]=2,代表在这个位置最多跳跃2步,即这个位置能达到num[1],num[2]这两个位     置
路线:2->3->4 或 2->1->1->4
     有多种路线,只需最后能跳跃到末尾就算成功,返回true,反之返回false  

示例2:

输入:[3,2,1,0,4,3]
输出:false
​
解释:无论如何,你总会到达数组下标为3的位置,无法到达终点

先分析一下问题,如果能够跳跃到最终位置,那么需要能够达到末尾元素的最后一跳能够跳到末尾元素,即 i + nums[i] >= nums.length(数组下标+数组元素>=数组长度),而上上个元素需要到达上一元素,这样层层嵌套,这就是贪心算法中的子问题形式。

从第一个元素开始遍历,设置一个变量maxPlace,记录当前遍历过的元素能够到达的最远位置,将遍历到的元素的下标+nums[i]与当前的maxPlace作比较,若大于maxPlace,则更新该变量,若maxPlace >= nums.length - 1,则能够达到终点,跳出循环。若遍历完当前能够到达的元素后,maxPlace <= nums.length - 1,则reture false

java代码实现:

class Solution {
    public boolean canJump(int[] nums) {
         int maxPlace = 0;  //能够到达的最远位置
​
        for (int i = 0; i < nums.length; i++) {
            if (i <= maxPlace) {
                maxPlace = Math.max(maxPlace, i + nums[i]);
                if (maxPlace >= nums.length - 1) {
                    return true;
                }
            }
        }
        return false;
    }
}

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值