leetcode 45

贪心算法

贪心算法是一种基于贪心策略的算法思想,它在每一步选择中都采取当前状态下最优的选择,从而希望能够得到全局最优解。

贪心算法的基本思想是通过局部最优解的选择来达到全局最优解。具体来说,贪心算法通常包含以下步骤:

  1. 定义问题的优化目标,明确问题的限制条件。
  2. 将问题分解为一系列子问题,每个子问题都可以通过贪心策略来求解。
  3. 根据贪心策略,选择当前状态下最优的解决方案。
  4. 更新问题的状态,继续迭代或者直到得到最终解。

贪心算法的优点是简单、高效,适用于一些特定类型的问题。然而,贪心算法并不保证能够得到全局最优解,因为它只关注当前步骤的最优解,而没有考虑未来可能的影响。因此,在使用贪心算法时,需要仔细分析问题的性质,确保贪心策略的正确性。

一些经典的贪心算法问题包括:找零钱问题、活动选择问题、背包问题、最小生成树问题等。

总之,贪心算法是一种简单而高效的算法思想,可以用于解决一些特定类型的问题,但需要注意贪心策略的正确性和问题的性质。

证明贪心的正确性

要证明贪心算法的正确性,需要证明两个方面:贪心选择性和最优子结构。

  1. 贪心选择性:贪心选择性是指每一步都选择当前最优的解决方案,即在每一步中选择能够跳跃的最远位置。对于跳跃游戏2问题,我们每次选择能够跳跃的最远位置,即更新maxPosition的值。这样可以保证在遍历过程中,每次跳跃都是当前最优的选择。

  2. 最优子结构:最优子结构是指问题的最优解可以通过子问题的最优解来构造。对于跳跃游戏2问题,我们可以将问题拆分成子问题,即从起点跳到每个位置的最小跳跃次数。假设我们已经知道了从起点跳到位置i的最小跳跃次数,那么从起点跳到位置i+1的最小跳跃次数可以通过以下方式计算:首先判断位置i是否超过了当前能够跳跃的边界位置end,如果超过了,说明需要进行一次跳跃,将步数加1,并更新边界位置为maxPosition。然后更新maxPosition为位置i+1和当前位置能够跳跃的最远位置之间的较大值。这样就可以得到从起点跳到位置i+1的最小跳跃次数。因此,问题的最优解可以通过子问题的最优解来构造,满足最优子结构的条件。

由于贪心选择性和最优子结构都成立,因此可以得出结论:贪心算法可以得到跳跃游戏2问题的最优解。

贪心答案

cpp 复制代码
class Solution {
public:
    int jump(vector<int>& nums) {

        int maxP =0;
        int n =nums.size();
        int end =0;
        int step =0;

        for(int i=0; i< n-1; ++i){
            if(maxP >= i){
                maxP = max(maxP, i+nums[i]);
                if(i == end){
                    end = maxP;
                    step++;
                }
            }
        }
        return step;
    }
};

dp答案

cpp 复制代码
class Solution {
    public int jump(int[] nums) {
        int n = nums.length;
        int[] f = new int[n]; 
        for (int i = 1, j = 0; i < n; i++) {
            while (j + nums[j] < i) j++;
            f[i] = f[j] + 1;
        }
        return f[n - 1];
    }
}

没怎么仔细看这个dp, 粘贴个答案。

作者:宫水三叶

链接:https://leetcode.cn/problems/jump-game-ii/solutions/594093/xiang-jie-dp-tan-xin-shuang-zhi-zhen-jie-roh4/

相关推荐
无限进步_17 分钟前
【C++】大数相加算法详解:从字符串加法到内存布局的思考
开发语言·c++·windows·git·算法·github·visual studio
C+-C资深大佬34 分钟前
C++ 数据类型转换是如何实现的?
开发语言·c++·算法
cwplh37 分钟前
DP 优化二:斜率优化 DP
算法·动态规划
Hcoco_me1 小时前
大模型面试题90:half2,float4这种优化 与 pack优化的底层原理是什么?
人工智能·算法·机器学习·langchain·vllm
浅念-1 小时前
链表经典面试题目
c语言·数据结构·经验分享·笔记·学习·算法
Python算法实战1 小时前
《大模型面试宝典》(2026版) 正式发布!
人工智能·深度学习·算法·面试·职场和发展·大模型
菜鸟233号2 小时前
力扣213 打家劫舍II java实现
java·数据结构·算法·leetcode
狐573 小时前
2026-01-18-LeetCode刷题笔记-1895-最大的幻方
笔记·算法·leetcode
Q741_1473 小时前
C++ 队列 宽度优先搜索 BFS 力扣 662. 二叉树最大宽度 每日一题
c++·算法·leetcode·bfs·宽度优先
Pluchon3 小时前
硅基计划4.0 算法 动态规划进阶
java·数据结构·算法·动态规划