贪心算法
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;
}
}
以上是关于贪心算法的主要内容,如果未能解决你的问题,请参考以下文章