首页 > 其他分享 >LeetCode 面试经典150题---003

LeetCode 面试经典150题---003

时间:2024-04-09 13:33:37浏览次数:15  
标签:150 nums int 到达 相交 --- 003 数组 跳跃

#### 55. 跳跃游戏

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。
1 <= nums.length <= 104
0 <= nums[i] <= 105
本题题意比较明确,我们可以将题目转化为找到多条相交的线段,最终就一定能够到达终点,如图所示。
image
上方的线表示每个元素最远能到达的位置,红线是相交的线段。下方的线是实际的路径,可以看出对于相交的线段,我们始终可以达到相交部分的点,再从相交部分的点到达更远的点,因为有相交说明上一点到相交点和相交点到更远点都能到达。
那代码怎么写。我们定义j为此时的最远距离,每次都会维护j这个最远距离,同时每次循环每个元素i,试想对于当前最远距离j,j前面的每个位置i的i+nums[i]都小于j,那就说明最远只能到达j,跳不出j,因此更远的地方永远无法到达。如果j之前的位置i存在i+nums[i]大于j,说明可以从i跳到更远的大于j的位置,那么这样就组成了两条相交的线段啦。

class Solution {
public:
    bool canJump(vector<int>& nums) {
        for(int i = 0, j = 0;i < nums.size();i ++ ){
            if(i > j) return false;
            j = max(j, i + nums[i]);
        }
        return true;
    }
};

#### 45. 跳跃游戏 II
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处。返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。
1 <= nums.length <= 104
0 <= nums[i] <= 1000
这题和上一题一样,不过这题要求跳跃的最小次数。我们考虑用动态规划,至于为什么用动态规划,因为它长得就像动态规划。我们定义f[i]为到达i的最小步数,那么如何维护f[i]呢,可以直接遍历从0-i-1的所有元素j,更新f[i]=min(f[i],f[j]+1),因为要到达i肯定是从i前面的某个位置跳跃而来。但是这样的话复杂度是\(O(n^{2})\),现在来考虑怎么优化。
分析可得,f[i]其实是个非递减数组,原因如下(1)对于f[i]和f[i+1],最好的情况是二者相等,即上一个点既可以跳到i也可以跳到i+1;(2)如果上一个点只能跳到i,那么f[i+1]就要比f[1]大1,要多跳一次。因此f[i]是一个非递减数组。回到刚刚的暴力做法,我们遍历i前面的所有j,其实我们只需要找到第一个能到达i的位置j,因为如果再往后的话,找到的f[j]都是大于等于第一个f[j]的,因此对答案没有影响,那为什么还要继续遍历呢,所以找到第一个就可以了。

class Solution {
public:
    int jump(vector<int>& nums) {
        int n = nums.size();
        vector<int> f(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];
    }
};

总结,贪心和动态规划的知识点比较多,但是自己太菜了,所以基本都是看的题解,哈哈哈。

标签:150,nums,int,到达,相交,---,003,数组,跳跃
From: https://www.cnblogs.com/timeac-coder/p/18123753

相关文章

  • 【攻防实操系列+域渗透】--域内主机(win7)配置
    1.设置静态IP,将DNS指向域控DNS的作用:定位域控2.创建域用户密码③❗❗❗至此,域内用户已经创建完成。3.把用户加入域❗会让你立即重启。切换用户,输入:new.com\lyj密码③❗❗❗至此,就是域内主机(win7)的大概配置了。......
  • 数据结构----栈和队列详细操作完整代码(C语言)
    栈和队列是两种常用的,重要的数据结构栈和队列是限定插入和删除只能在表的“端点”进行的线性表栈和队列是线性表的子集(是插入和删除位置受限的线性表)栈定义:只能在表的一端(栈顶)进行插入和删除运算的线性表逻辑结构:与线性表相同,仍为一对一关系存储结构:用顺序栈或链栈存......
  • 数据结构--二叉树
    1.树的概念树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。如果将他的图画出来的话很像一棵树。1.1名词概念根结点:没有父结点(前驱节点)的结点;如上方A就是根结点父结点或双亲结点:如果这个结点下方还有结点(孩子节点)那么称这个结点为下方结点......
  • 洛谷题单指南-数学基础问题-P3913 车的攻击
    原题链接:https://www.luogu.com.cn/problem/P3913题意解读:车所在的行、列一共有多个个格子。解题思路:假设3*3的棋盘,有三个车分析得知,三个车覆盖了第1、2两行,第2、3两列,覆盖的格子数用公式计算就是2*3+2*3-2*2=8也就是两行格子数加两列格子数再减去交叉点。因此......
  • 从零开始写 Docker(十)---实现 mydocker logs 查看容器日志
    本文为从零开始写Docker系列第十篇,实现类似dockerlogs的功能,使得我们能够查查看容器日志。完整代码见:https://github.com/lixd/mydocker欢迎Star推荐阅读以下文章对docker基本实现有一个大致认识:核心原理:深入理解Docker核心原理:Namespace、Cgroups和Rootfs......
  • 若依RuoYi-Vue代码生成,新建一个增删改查模块
    启动ruoyi-ui,登录前端后台 以cti_faq问答对表为例。首先在mysql数据库中建张cti_faq表CREATETABLE`cti_faq`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'编号',`question`varchar(255)DEFAULTNULLCOMMENT'问题内容',`answer`textCOMMENT'答案......
  • 【攻防实操系列+域渗透】--安装域控(Windows-Server-2008-R2-x64)教程
    1.创建windows2008R2虚拟机选完全安装。第一个是标准版功能很少。不建议选。另外两个任意选。我选的是Enterprse企业版。❗❗❗注意:需要提前了解域控的密码复杂度规则。密码一定要自己记住!!!密码①可以看到界面非常小,不方便操作。❗❗❗需要安装vm......
  • AtCoder Beginner Contest 348 A-F 题解
    A-PenaltyKickQuestion高桥将在一场足球比赛中获得\(N\)个点球。对于第\(i\)个罚球,如果\(i\)是\(3\)的倍数,他将罚球失败,否则罚球成功。请打印他罚球的结果。Solution当\(i\%3==0\)时说明能被\(3\)整除Code#include<bits/stdc++.h>usingnamespacest......
  • Linux mformat命令教程:MS-DOS文件系统的磁盘格式化工具(附实例详解和注意事项)
    Linuxmformat命令介绍mformat是一个用于在低级格式化的磁盘上添加MS-DOS文件系统的命令。它可以在已经通过Unix低级格式化的磁盘上添加一个最小的MS-DOS文件系统(包括引导扇区、FAT和根目录)。Linuxmformat命令适用的Linux版本mformat命令在大多数Linux发行版中都可以使......
  • STLINK-V3PWR连接STM32最小系统板方法(含引脚分布)
    前段时间导师给我了一个STLINK-V3PWR,让我试着用它下载程序到STM32单片机上,我找了半天发现网上资源挺少的,于是自己搞了一下,从官网下载了相关的规格书,然后连了一下。下面是我自己找的官方资源然后翻译的。下面是STLINK-V3PWR的调试端口引脚分布。手上只有STM32F103C6T6A......