贪心算法

Posted 浮云神码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心算法相关的知识,希望对你有一定的参考价值。

     贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。贪心算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择,就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解。虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪心算法不要回溯。


/** * https://leetcode-cn.com/problems/jump-game * 55. 跳跃游戏 * 难度 中等 * 给定一个非负整数数组nums ,你最初位于数组的 第一个下标 。 * 数组中的每个元素代表你在该位置可以跳跃的最大长度。 * 判断你是否能够到达最后一个下标。 * * 示例1: * 输入:nums = [2,3,1,1,4] * 输出:true * 解释:可以先跳 1 步,从下标 0 到达下标 1, * 然后再从下标 1 跳 3 步到达最后一个下标。 * * 示例2: * 输入:nums = [3,2,1,0,4] * 输出:false * 解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , * 所以永远不可能到达最后一个下标。 * * 提示: * * 1 <= nums.length <= 3 * 104 * 0 <= nums[i] <= 105 * * 来源:力扣(LeetCode) * 链接:https://leetcode-cn.com/problems/jump-game */public class JumpGame { public boolean canJump(int[] nums) { int n = nums.length; // 可以跳跃到达的最大位置 int maxPosition = 0;
// 遍历整个数组或到达最大可达位置后停止 for(int i = 0; i < n && i <= maxPosition; i++) { // 维护最大可达位置, 寻找基于本次迭代的最优解 maxPosition = Math.max(i + nums[i], maxPosition); // 最大可达位置大于等于数组末尾时, 结束 if (maxPosition >= n - 1) { return true; } } return false; }}


/** * https://leetcode-cn.com/problems/jump-game-ii * 45. 跳跃游戏 II * 难度 中等 * 给你一个非负整数数组nums ,你最初位于数组的第一个位置。 * 数组中的每个元素代表你在该位置可以跳跃的最大长度。 * 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 * 假设你总是可以到达数组的最后一个位置。 * * 示例 1: * 输入: nums = [2,3,1,1,4] * 输出: 2 * 解释: 跳到最后一个位置的最小跳跃数是 2。 * 从下标为 0 跳到下标为 1 的位置,跳1步,然后跳3步到达数组的最后一个位置。 * * 示例 2: * 输入: nums = [2,3,0,1,4] * 输出: 2 * * 提示: * 1 <= nums.length <= 104 * 0 <= nums[i] <= 1000 * * 来源:力扣(LeetCode) * 链接:https://leetcode-cn.com/problems/jump-game-ii */public class JumpGameII { public int jump(int[] nums) { // 能够跳跃达到的最大位置索引 int maxPosition = 0; // 跳跃次数 int result = 0; /** * 核心思想是根据本次跳跃的范围计算出下次跳跃的范围 * 根据贪心算法计算出本次可以跳跃到的最大位置 */ for (int i = 0; i < nums.length && i <= maxPosition;) { if (maxPosition >= nums.length - 1) { return result; } int currentMaxPosition = maxPosition; // 计算本次跳跃范围内的最优解 // [i, currentMaxPosition] 是本次跳跃的范围 // 循环结束后i的值被设置为下一次的跳跃的起点 currentMaxPosition + 1 for (; i <= currentMaxPosition; i++) { // 计算出下一次跳跃的最大距离 maxPosition = Math.max(maxPosition, i + nums[i]); } // 计算跳跃次数 result++; } return result; }}


以上是关于贪心算法的主要内容,如果未能解决你的问题,请参考以下文章

贪心算法----区间覆盖问题(POJ2376)

Contig|scaffold|N50|L50|NG50|贪心算法|de bruiji graph|

贪心算法学习手册开放下载!!

贪心算法(各种贪心题目)

贪心算法-第一节:贪心算法概述

Matlab-贪心/贪婪算法