一、贪心算法简介
贪心算法:英文全称:Greedy Algorithm,基本思想是在解决最优解的问题时,将求解过程分为若干个步骤,每个步骤都应用贪心原则,选取当前状态下最好/最优的选择(局部最有利的选择),并且希望此选择最后累积的结果也是最优的解,问题的最优解是由子问题的最优解堆叠而来的。
顾名思义,贪心法好像一个贪婪的人,处于当前的这个阶段,他做出的选择都是当前他能看到的最好的选择,贪图眼前利益的最大化,完全不顾未来会怎么样,但贪心算法要求眼前利益最优,最终问题利益也最优。
二、贪心法的基本步骤
-
从某个初始解出发
-
采用迭代的过程,当可以向目标前进一部时,就根据局部最优策略,得到一部份解,缩小问题规模
-
将所有解综合起来
三、贪心法的经典问题
问题一:跳跃游戏
题目描述:
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度,判断你是否能够到达最后一个位置。
示例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; } }