一.什么是贪心算法?
贪心算法又称之为贪婪算法,在考虑问题时,总是做出在当前状况来说最好的算则,而不从整理来考虑。从某种意义上说是局部最优解,贪心算法所得到的答案并不一定是整体最优解,所以在使用贪心算法一定要考虑清楚,是否能使用贪心算法。
选择的贪心策略必须具有无后效性,即当前选择的结果必须不能对之前的结果状态产生影响,而只与当前状态有关。
二.贪心算法思想
- 建立数学模型来描述问题。
- 把求解问题分成若干个子问题。
- 对每一子问题求解,得到子问题的局部最优解。
- 把子问题的局部最优解合成原来解问题的一个解。
三. 贪心算法与动态规划区别
- 背景介绍:这两种算法都是选择性算法,就是从一个候选集合中选择适当的元素加入解集合。
贪心算法的选择策略即贪心选择策略,通过对候选解按照一定的规则进行排序,然后就可以按照这个排好的顺序进行选择了,选择过程中仅需确定当前元素是否要选取,与后面的元素是什么没有关系。
动态规划的选择策略是试探性的,每一步要试探所有的可行解并将结果保存起来,最后通过回溯的方法确定最优解,其试探策略称为决策过程。
2.主要不同:两种算法的应用背景很相近,针对具体问题,有两个性质是与算法选择直接相关的,最优子结构性质和贪心选择性质。
最优子结构性质是选择类最优解都具有的性质,即全优一定包含局优。
当时我们也提到了贪心选择性质,满足贪心选择性质的问题可用贪心算法解决,不满足贪心选择性质的问题只能用动态规划解决。可见能用贪心算法解决的问题理论上都可以利用动态规划解决,而一旦证明贪心选择性质,用贪心算法解决问题比动态规划具有更低的时间复杂度和空间复杂度。
四.贪心算法例题
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例 1:
输入: [2,3,1,1,4]
输出: true
解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置。
示例 2:
输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
/*使用贪心算法 *1.假如能到达最后一步,则只考虑局部到达最后一步的算法 *2.将目标target定为最后一步,依次往前判断是否有元素能跳到最后一步 *3.取最靠近能到达target的元素,将其定为target,重复2. *4.最终判断target能否是第一个元素,如果是则true,否则false。 */ class Solution { public boolean canJump(int[] nums) { if(nums.length==1) { return true; } int number=nums.length-1; boolean temp=false; int distance=-1; while(number>=0) { temp=false; for(int i=number-1;i>=0;i--) { if(nums[i]>=(number-i)) { number=i; temp=true; break; }else { distance=i; } } if(distance==0||number==0) { break; } } return temp; } }