贪心算法-01:跳跃游戏

关于贪心算法

贪心算法是动态规划的一个特例,相对于动态规划,使用贪心算法需要满足更多条件,但是效率比动态规划要高。

贪心选择的性质就是:每一步都做出一个局部最优解,最终的结果就是全局最优。不过这是一种特殊性质,只有一部分问题拥有这个性质。

比如面前放有100张人民币,你只能拿十张。想要拿到最高的金额,就需要每次选择剩下钞票中面值最大的一张,最后你的选择一定是最优的。

接下来,我会演示跳跃游戏Ⅱ的 动态规划解法 和 贪心算法解法,通过对比来说明贪心算法的 “局部最优解” 是怎样的。

力扣45.跳跃游戏Ⅱ

动态规划解法 

定义dp函数

使用动态规划解法就是 [分解问题]。

我们的原始问题是:从初始位置跳到最后一个位置的最小跳跃次数。

我们将其分解出子问题:从索引 p 跳到最后一个位置的最小跳跃次数。

//定义dp函数:从索引p跳到数组末尾的最小跳跃次数为dp(nums,p)
int dp(int[] nums,int p)

base case

对边界问题进行处理。这里的边界问题就是当索引 p 到达数组末尾时,不需要跳跃

if(p >= nums.length - 1){
    return 0;
}

使用备忘录数组解决重叠子问题,写出动态规划解法的代码

public int jump(int[] nums) {
    int n = nums.length;
    //memo[i] 表示从 0 到 i 下标最少跳跃次数 
    int[] memo = new int[n];
    //将数组初始化为一个不可能取到的值,比如 n
    //(因为从 0 到 n-1 最多 n-1 步)
    Arrays.fill(memo, n);
    return dp(nums, 0, memo);
}

public int dp(int[] nums, int p, int[] memo) {
    int n = nums.length;
    //base case
    if (p >= n - 1) {
        return 0;
    }
    if (memo[p] != n) {
        return memo[p];
    }
    //获取索引 p 中的跳跃步数,做为选择列表
    int steps = nums[p];
    for (int i = 1; i <= steps; i++) {
        //写出子问题
        int subProblem = dp(nums, p + i, memo);
        //写出状态转移方程
        memo[p] = Math.min(memo[p], subProblem + 1);
    }
    return memo[p];
}

贪心算法解法

刚才的动态规划思路穷举了所有的子问题,然后取最小的作为结果。而贪心算法并不穷举所有子问题,而是每次做出最优的选择

对于这个 0 下标来说,有1、2、3 三种跳法。其中选择跳两步到 2 下标,然后再跳 4 步,能挑到最远距离。所以我们只选择这种情况来遍历,这就是我们的最优解

我们使用 end 来记录 :“目前能够到达的最远距离”。以上图为例,当 i = 0 时,我们能够到达的最远距离为 3 下标。

我们使用 farthest 来记录 : “以当前下标为起点能够跳到的最远距离”。以上图为例,当 i = 0 时,我们能够到达的最远距离为 3 下标;当 i = 2 时,我们能够到达的最远距离就是 6 下标。

那么我们就要选择能够跳的最远的下标作为我们的最优解。当我们以 0 下标为起点时,“目前能够到达的最远距离” 是 3 下标,所以 end = 3.

我们能够选择的下标中(能选择1、2、3 下标),2下标能跳的最远,最远能跳到 6 下标,farthest = 6。所以我们以 2 下标为目的地进行一次跳跃 。

所以我们遍历数组中每一个下标的目的,就是为了找到 “以这个下标为起始点,能够跳到最远距离”,当遍历的下标超出了目前我们能够到达的最远距离,我们进行一次跳跃,并更新 “目前能够到达的最远距离” end

public int jump(int[] nums) {
    int n = nums.length;
    int end = 0, farthest = 0;
    int jumps = 0;
    for (int i = 0; i < n - 1; i++) {
        farthest = Math.max(nums[i] + i, farthest);
        //当下标遍历到我们目前能够到达的最远距离时,进行一次跳跃
        if (end == i) {
            jumps++;
            end = farthest;
        }
    }
    return jumps;
}

 力扣55、跳跃游戏

这道题比较简单,我们只需要判断跳到的最远距离是否能够超出数组长度即可

class Solution {
    public boolean canJump(int[] nums) {
        int farthest = 0;
        int n = nums.length;
        for(int i = 0;i < n - 1;i++){
            farthest = Math.max(farthest,i+nums[i]);
            if(farthest <= i){
                return false;
            }
        }
        return farthest >= n - 1;
    }
}

 问题1:farthest <= i 代表着什么?

farthest代表能够跳到的最远距离(最远下标),如果farthest <= i ,说明 i 下标无法被越过

  • 当 farthest 等于 i 时,表示当前位置 i 是一个零值,无法从该位置继续向后跳跃。但凡 i 下标有一个非零值,farthest 都应该更新为 nums[i] + i
  • 当 farthest 小于 i 时,表示在之前的跳跃过程中,最远距离已经被超过了,不再有效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/348199.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp组件库中Collapse 折叠面板 的使用方法

目录 #平台差异说明 #基本使用 #控制面板的初始状态&#xff0c;以及是否可以操作 #自定义样式 #1. 如果修改展开后的内容&#xff1f; #2. 如何自定义标题的样式&#xff1f; #3. 如何修改整个Item的样式&#xff1f; #API #Collapse Props #Collapse Item Props #…

ORM-06-jooq 入门介绍

拓展阅读 The jdbc pool for java.(java 手写 jdbc 数据库连接池实现) The simple mybatis.&#xff08;手写简易版 mybatis&#xff09; JOOQ JOOQ 可以通过数据库直接生成 java 代码&#xff0c;通过 flent-api 进行数据库操作。 SQL builder JOOQ 非常的灵活和强大。你可…

深入理解旅游网站开发:Java+SpringBoot+Vue+MySQL的实战经验

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

flink内存管理(三):MemorySegment内存使用场景:托管内存与网络内存

文章目录 一.ManagedMemory&#xff08;算子&#xff09;内存的申请与使用1. tm内存申请与使用大致流程2. 创建MemoryManager实例3. 算子使用通过MemoryManager使用内存4. ManagedMemory内存空间申请流程 二.NetworkBuffer内存申请与使用1. NetworkBuffer构造器 在Flink内存模型…

Windows11 Copilot助手开启教程(免费GPT-4)

Windows11上开启Copilot助手教程踩坑指南 Copilot介绍Copilot开启步骤1、更新系统2、更改语言和区域3、下载 ViVeTool 工具4、开启Copilot 使用 Copilot介绍 Windows Copilot 是 Windows 11 中的一个新功能&#xff0c;它可以让你与一个智能助理进行对话&#xff0c;获取信息&…

树莓派无显示屏连接

终端命令控制树莓派关机 1&#xff1a;用网线连接树莓派 按照正常的步骤 &#xff0c;搜索控制面板&#xff0c;网络和internet&#xff0c;网络和共享中心&#xff0c;更改适配器设置&#xff0c;右键WIFI&#xff0c;点击属性&#xff0c;点击共享&#xff0c;打勾允许即可&…

5G安卓手机定制_基于天玑900的安卓主板方案

5G安卓手机方案是一款采用联发科MT6877(天玑900)平台的高性能、可运行安卓操作系统的5G智能模块。该手机采用台积电6纳米低功耗工艺&#xff0c;主频高达2.4GHz&#xff0c;内存支持LPDDR5&#xff0c;并支持5G Sub-6GHz全频段和5G双载波聚合技术等多种制式。同时&#xff0c;该…

Typora1.7.6安装、激活、图床设置和使用

1.安装Typora 双击”typora-setup-x64-1.7.6.exe“安装包。 如果之前安装过先卸载&#xff0c;删除原文件夹。 Typora 1.7.6下载 提取码&#xff1a;ix2b 选择“Install for all users”。 图1-1 选择安装模式 选择安装目录&#xff0c;然后选择“Next”。 图1-2 选择安装路…

23111 C++ day2

思维导图 自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height),定义公有成员函数: 初始化函数:void init(int w, int h)更改宽度的函数:set_w(int w)更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show() #include <iostream&g…

web安全学习笔记【10】——数据包分析

基础[1] [2] [3] [4] 入门-HTTP数据包&Postman构造&请求方法&请求头修改&状态码判断[5] [6] [7] #知识点&#xff1a; 1、Web常规-系统&中间件&数据库&源码等 2、Web其他-前后端&软件&Docker&分配站等 3、Web拓展-CDN&WAF&OS…

go语言(十三)-----interface

一、Interface 通用万能类型 空接口int&#xff0c;string&#xff0c;float&#xff0c;struct都实现了interface都可以用interface{}类型,引用任意的数据类型 package mainimport "fmt"//interface()是万能数据类型 func myFunc(arg interface{}) {fmt.Println(&…

pycharm中无法使用anaconda虚拟环境

anaconda里创建了虚拟环境&#xff0c;然后在虚拟环境中明明安装了TensorFlow1.12&#xff0c;但是到pycharm中使用anaconda的虚拟环境时&#xff0c;就是没有TensorFlow1.12&#xff0c;注意下面这幅图 里面有一个选项“use conda package manager”&#xff0c;这个默认是勾…

聊聊 程序员裁员潮:技术变革下的职业危机

前几天一则新闻爆料&#xff1a;一对来自中国的工程师夫妻在美身亡&#xff0c;疑因谷歌裁员致悲剧发生。看到后深感可惜&#xff0c;鲜活的生命就因为裁员殒落了&#xff1b;同时我也深有感触&#xff0c;有幸经历过裁员&#xff0c;体会过那一段低迷不振的日子。 但是回首当下…

Aleo项目详细介绍-一个兼顾隐私和可编程性的隐私公链

Aleo上线在即&#xff0c;整理一篇项目的详细介绍&#xff0c;喜欢的收藏。有计划做aleo节点的可交流。 一、项目简介 Aleo 最初是在 2016 年构思的&#xff0c;旨在研究可编程零知识。公司由 Howard Wu、Michael Beller、Collin Chin 和 Raymond Chu 于 2019 年正式成立。 …

Docker 和 Kubernetes:容器化时代的崛起与演变

在过去的十年间&#xff0c;容器化技术彻底改变了软件开发和部署的面貌。 Docker 的登场无疑是这场变革的催化剂&#xff0c;它将应用和服务的打包、分发、部署流程标准化&#xff0c;让开发者的生活变得更加简单。 紧随其后&#xff0c;Kubernetes 作为容器编排的领军者&#…

文旅AI交互数字人,提升景区数字化导览服务体验

随着数字化的普及&#xff0c;文化旅游逐渐走向数字化&#xff0c;通过数字人技术手段对文化旅游资源进行整合与开发。 AI交互数字人可以部署于交互式终端设备和移动端&#xff0c;可以为游客提供“面对面”的语音交互&#xff0c;提供路径规划、游览路线推荐、景点讲解等服务&…

IP被封怎么办?访问网站时IP被阻止?解决IP禁令全方法

相信很多人遇到过IP禁令&#xff1a;比如你在访问社交媒体、搜索引擎或电子商务网站时会被限制访问&#xff0c;又或者你的的账号莫名被封&#xff0c;这些由于网络上的种种限制我们经常会遭遇IP被封的情况&#xff0c;导致无法使用继续进行网络行动。在本文中&#xff0c;我们…

【Leetcode】2859. 计算 K 置位下标对应元素的和

文章目录 题目思路代码结果 题目 题目链接 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 请你用整数形式返回 nums 中的特定元素之和 &#xff0c;这些特定元素满足&#xff1a;其对应下标的二进制表示中恰存在 k 个置位。 整数的二进制表示中的 1 就是这个整数的…

数灵通让抖音跳转微信公众号更方便

当提到抖音跳转微信&#xff0c;人们通常指的是在抖音平台上利用一些方法将用户引导到企业的微信公众号。以下是关于如何实现这一目标的一些建议&#xff1a; 1.扫码跳转&#xff1a;在抖音视频或动态中嵌入一个二维码&#xff0c;用户扫描后可自动跳转至微信公众号页面。 2.个…

ERA ·Era Network:Web3.0社交的破局者

在当今数字化环境中&#xff0c;互联网的集中化严重制约了个人对数据的控制权&#xff0c;引发了对数据隐私、所有权和自主权的重大关切。这一问题尤其在社交网络、数据存储和内容传输等关键领域表现得尤为明显&#xff0c;用户常常感到无法充分掌握自己的数字身份和个人数据。…
最新文章