算法沉淀——贪心算法五(leetcode真题剖析)

在这里插入图片描述

算法沉淀——贪心算法五

  • 01.跳跃游戏 II
  • 02.跳跃游戏
  • 03.加油站
  • 04.单调递增的数字

01.跳跃游戏 II

题目链接:https://leetcode.cn/problems/jump-game-ii/

给定一个长度为 n0 索引整数数组 nums。初始位置为 nums[0]

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

  • 0 <= j <= nums[i]
  • i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]

示例 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
  • 题目保证可以到达 nums[n-1]

思路

这里我们可以利用层序遍历的思想进行数组遍历,从第一步开始,计算每一步能跨出的范围内最大的那个数字的步数,这样我们就可以找到需要使用的最小的跳跃步数。

代码

class Solution {
public:
    int jump(vector<int>& nums) {
        int left=0,right=0,maxPos=0,count=0,n=nums.size();
        while(left<=right){
            if(maxPos>=n-1) return count;
            for(int i=left;i<=right;i++) maxPos=max(maxPos,nums[i]+i);
            left=right+1;
            right=maxPos;
            count++;
        }
        return -1;
    }
};

02.跳跃游戏

题目链接:https://leetcode.cn/problems/jump-game/

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false

示例 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 <= 104
  • 0 <= nums[i] <= 105

思路

这道题可以借用上面的思想,只需修改返回值即可。

代码

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int left=0,right=0,maxPos=0,count=0,n=nums.size();
        while(left<=right){
            if(maxPos>=n-1) return true;
            for(int i=left;i<=right;i++) maxPos=max(maxPos,nums[i]+i);
            left=right+1;
            right=maxPos;
            count++;
        }
        return false;
    }
};

03.加油站

题目链接:https://leetcode.cn/problems/gas-station/

在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。

你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。

给定两个整数数组 gascost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。

示例 1:

输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]
输出: 3
解释:
从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油
开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油
开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油
开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油
开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油
开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。
因此,3 可为起始索引。

示例 2:

输入: gas = [2,3,4], cost = [3,4,3]
输出: -1
解释:
你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。
我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油
开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油
开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油
你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。
因此,无论怎样,你都不可能绕环路行驶一周。

提示:

  • gas.length == n
  • cost.length == n
  • 1 <= n <= 105
  • 0 <= gas[i], cost[i] <= 104

思路

枚举所有起点,模拟加油的流程,但在这里做一个优化,就是贪心思想,我们在枚举每一个点时,若该点不成功,就直接跳过中间所有点,这样我们可以做很大的优化。

代码

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int n=gas.size();
        for(int i=0;i<n;i++){
            int rest = 0, step = 0;
            while(step<n){
                int  index=(i+step)%n;
                rest+=gas[index]-cost[index];
                if(rest<0) break;
                step++;
            }
            if(rest>=0) return i;
            i+=step;
        }
        return -1;
    }
};

04.单调递增的数字

题目链接:https://leetcode.cn/problems/monotone-increasing-digits/

当且仅当每个相邻位数上的数字 xy 满足 x <= y 时,我们称这个整数是单调递增的。

给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增

示例 1:

输入: n = 10
输出: 9

示例 2:

输入: n = 1234
输出: 1234

示例 3:

输入: n = 332
输出: 299

提示:

  • 0 <= n <= 109

思路

为了方便处理数字,我们可以先将整数转换成字符串,然后从左往右扫描,找到第一个递减的位置,然后从这个位置往前推,推到相同数字的最前端,该位置-1,后面所有数都改成9,这样就得到最终结果

代码

class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        string s=to_string(n);

        int i=0,m=s.size();
        while(i+1<m&&s[i]<=s[i+1]) i++;

        if(i+1==m) return n;

        while(i-1>=0&&s[i]==s[i-1]) i--;

        s[i]--;
        for(int j=i+1;j<m;j++) s[j]='9';
        return stoi(s);
    }
};

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

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

相关文章

一共有哪 3 类线程安全问题

一共有哪 3 类线程安全问题 运行结果错误发布和初始化导致线程安全问题活跃性问题死锁活锁饥饿 要想弄清楚有哪 3 类线程安全问题&#xff0c;首先需要了解什么是线程安全&#xff0c;线程安全经常在工作中被提到&#xff0c;比如&#xff1a;你的对象不是线程安全的&#xff0…

2024新版计算器:腾讯云服务器价格计算器,报价不求人

腾讯云服务器价格计算器可以一键计算出云服务器的精准报价&#xff0c;包括CVM实例规格价格、CPU内存费用、公网带宽收费、存储系统盘和数据盘详细费用&#xff0c;腾讯云百科txybk.com分享腾讯云价格计算器链接入口、使用方法说明&#xff0c;在腾讯云百科 txy.wiki 查看当前最…

全球盲盒火热下,海外盲盒APP助力我国盲盒出海

盲盒具有不确定性&#xff0c;与各类热门影视动漫合作推出的专属盲盒商品&#xff0c;吸引了无数年轻人&#xff0c;成为了年轻人的娱乐消费首选方式。 在互联网电商的推动下&#xff0c;盲盒在全球内的市场规模迅速扩大。受到市场增长的影响&#xff0c;各类资本公司也纷纷进…

【Python】import无法导入某一目录下的文件

问题&#xff1a; 如图所示&#xff0c;我在mains文件夹下面有一个main_VAE.py的程序&#xff0c;在与mains同级目录的models文件夹下面有一个variational_autoencoder.py&#xff08;可能上图无法显示完全models文件夹&#xff09;&#xff0c;此时我想要在main_VAE.py程序中导…

数据结构从入门到精通——直接选择排序

直接选择排序 前言一、选择排序的基本思想&#xff1a;二、直接选择排序三、直接选择排序的特性总结&#xff1a;四、直接选择排序的动画展示五、直接选择排序的代码展示test.c 六、直接选择排序的优化test.c 前言 直接选择排序是一种简单的排序算法。它的工作原理是每一次从未…

Linux-docker安装数据库mysql

1、拉去mysql镜像&#xff1a; docker pull mysql2、创建容器挂载路径 mkdir -p /usr/local/jiuxiang/mysql/data # 数据存储位置 mkdir -p /usr/local/jiuxiang/mysql/logs # 日志存储位置 mkdir -p /usr/local/jiuxiang/mysql/conf # 配置文件3、启动容器 docker run -…

详细分析Python模块中的雪花算法(附模板)

目录 前言1. 基本知识2. 模板3. Demo 前言 分布式ID的生成推荐阅读&#xff1a;分布式ID生成方法的超详细分析&#xff08;全&#xff09; 1. 基本知识 Snowflake 算法是一种用于生成全局唯一 ID 的分布式算法&#xff0c;最初由 Twitter 设计并开源 它被设计用于解决分布式…

sentinel整合openFeign实现fall服务降级

服务提供方: 导入依赖&#xff1a; <!--openfeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--alibaba-sentinel--><depend…

猫猫编号

解法&#xff1a; 暴力 #include<iostream> #include<algorithm> #include<vector> using namespace std; #define endl \nint main() {int n, m, sum 1;cin >> n >> m;string s;cin >> s;int pre s[0] - 0;int t 0;for (int i 1; i…

【DAY13 软考中级备考笔记】操作系统

操作系统 3月17日 – 天气&#xff1a;晴 凑着周末&#xff0c;赶紧把操作系统完结一下。 1. 管程 管程也属于操作系统中的一种同步机制&#xff0c;为了解决多线程环境中的并发控制问题。它提供了一系列的高级同步原语。 作用于信号量一样&#xff0c;但是管程便携程序更加简单…

腾讯云优惠券介绍、领取入口及使用教程

腾讯云作为国内领先的云服务提供商&#xff0c;一直以其稳定、高效、安全的服务赢得了广大用户的信赖。为了回馈广大用户&#xff0c;腾讯云经常会推出各种优惠活动&#xff0c;其中优惠券就是最为常见和受欢迎的一种。 一、腾讯云优惠券介绍 腾讯云优惠券是腾讯云官方推出的一…

Json Web Token(JWT) 快速入门

推荐视频&#xff1a;【从零开始掌握JWT】 目录 第一章 会话跟踪 01 使用Cookie和Session&#xff0c;jsessionid 02 使用token 例子一&#xff1a;自定义token 例子二&#xff1a;使用redis存储token 第二章 会用JWT 01 TOKEN的特点 02 什么时候使用JWT 03 JWS-JWE…

Linux学习:git补充与调试工具gdb

目录 1. git版本控制器&#xff08;续&#xff09;1.1 git本地仓库结构1.2 git实现版本控制与多人协作的方式1.3 git相关指令&#xff0c;多分支模型与.gitignore文件 2. gdb调试工具2.1 企业项目开发流程简述与调试的必要性2.2 bug的调试思路方法与调式工具的使用 1. git版本控…

目标检测---IOU计算详细解读(IoU、GIoU、DIoU、CIoU、EIOU、Focal-EIOU、SIOU、WIOU)

常见IoU解读与代码实现 一、✒️IoU&#xff08;Intersection over Union&#xff09;1.1 &#x1f525;IoU原理☀️ 优点⚡️缺点 1.2 &#x1f525;IoU计算1.3 &#x1f4cc;IoU代码实现 二、✒️GIoU&#xff08;Generalized IoU&#xff09;2.1 GIoU原理☀️优点⚡️缺点 2…

深入理解Java中的TCP连接:三次握手和四次挥手

欢迎来到我的博客&#xff01;今天我们将一起探索网络通信的奥秘。在Java编程中&#xff0c;我们经常会涉及到网络通信&#xff0c;而TCP协议是实现可靠数据传输的重要协议之一。在建立TCP连接和断开连接的过程中&#xff0c;三次握手和四次挥手是至关重要的步骤。本文将深入探…

rt-thread(5.0版本)之sfud组件的使用问题记录(w25q128存储模块)

前言 记录一下5.0版本时使用官方推荐的函数与底层驱动存在的不兼容问题 相关宏定义 // -----------------------------SPI 组件 #define RT_USING_SPI #define RT_USING_SFUD #define RT_SFUD_USING_SFDP #define RT_SFUD_USING_FLASH_INFO_TABLE #define RT_SFUD_SPI_MAX_HZ…

生骨肉冻干喂养有哪些优点?对猫身体好的生骨肉冻干分享

随着科学养猫知识的普及&#xff0c;生骨肉冻干喂养越来越受到养猫人的青睐。生骨肉冻干不仅符合猫咪的饮食天性&#xff0c;还能提供均衡的营养&#xff0c;有助于维护猫咪的口腔和消化系统健康。很多铲屎官看到了生骨肉冻干喂养的好处&#xff0c;打算开始生骨肉冻干喂养&…

ES 常见面试题及答案

目录 es 写入数据流程 es 删除数据流程 es 读数据流程 es 部署的服务有哪些角色 es 的实现原理 es 和lucence 关系 如何提高写入效率 提高搜索效率 es doc value指的啥 分片指的啥&#xff0c;定义后可不可义再修改 深分页如何优化 对于聚合操作是如何优化的 元数据…

微服务高级篇(二):分布式事务+Seata架构

文章目录 一、分布式事务理论基础1.1 CAP定理1.2 BASE理论 二、初始Seata2.1 Seata的架构2.2 部署TC【事务协调者】服务2.3 微服务集成Seata 三、实践3.1 XA模式3.1.1 原理3.1.2 实现 3.2 AT模式3.2.1 原理3.2.2 脏写问题以及解决方案【全局锁超时处理】3.2.3 实现 3.3 TCC模式…

机器人路径规划:基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(提供Python代码)

迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的&#xff0c;因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法&#xff0c;解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始&#xff0c;采用贪心算法的策略&#…