【LeetCode算法系列题解】第61~65题

CONTENTS

    • LeetCode 61. 旋转链表(中等)
    • LeetCode 62. 不同路径(中等)
    • LeetCode 63. 不同路径 II(中等)
    • LeetCode 64. 最小路径和(中等)
    • LeetCode 65. 有效数字(困难)

LeetCode 61. 旋转链表(中等)

【题目描述】

给你一个链表的头节点 head,旋转链表,将链表每个节点向右移动 k 个位置。

【示例1】

在这里插入图片描述

输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]

【示例2】

在这里插入图片描述

输入:head = [0,1,2], k = 4
输出:[2,0,1]

【提示】

链表中节点的数目在范围 [0, 500]
− 100 ≤ N o d e . v a l ≤ 100 -100\le Node.val\le 100 100Node.val100
0 ≤ k ≤ 2 ∗ 1 0 9 0\le k\le 2 * 10^9 0k2109

【分析】


在这里插入图片描述

首先由于 k k k 可能很大,当 k k k 超过链表结点数 n n n 时,就变成了重复的循环位移,因此 k k k 需要先对 n n n 取模。

以样例1为例,示意图如上图所示,算法流程如下:

  • 先遍历一遍链表,求出链表长度 n n n,并记下最后一个结点 tail
  • 我们需要将链表的最后 k k k 个结点移动到首部,因此需要先找到倒数第 k + 1 k+1 k+1 个结点 P,也就是正数第 n − k n-k nk 个结点,那么就需要从头结点向后遍历 n − k − 1 n-k-1 nk1 次;
  • tail->next = head
  • head = P->next
  • P->next = nullptr

【代码】

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* rotateRight(ListNode* head, int k) {if (!head) return head;  // 需要特判链表为空的情况ListNode* tail;int n = 0;for (auto p = head; p; p = p->next) n++, tail = p;k %= n;auto p = head;for (int i = 0; i < n - k - 1; i++) p = p->next;tail->next = head, head = p->next, p->next = nullptr;return head;}
};

LeetCode 62. 不同路径(中等)

【题目描述】

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start”)。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
问总共有多少条不同的路径?

在这里插入图片描述

【示例1】

输入:m = 3, n = 7
输出:28

【示例2】

输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下

【示例3】

输入:m = 7, n = 3
输出:28

【示例4】

输入:m = 3, n = 3
输出:6

【提示】

1 ≤ m , n ≤ 100 1\le m, n\le 100 1m,n100
题目数据保证答案小于等于 2 ∗ 1 0 9 2 * 10^9 2109

【分析】


本题是动态规划的数字三角形模型中的裸题,我们定义 f[i][j] 表示从起点走到点 (i, j) 的路径方案数,那么状态的转移有以下几种情况:

  • 如果在第一行,那么只能从左边的点转移过来,即 f[i][j] = f[i][j - 1]
  • 如果在第一列,那么只能从上边的点转移过来,即 f[i][j] = f[i - 1][j]
  • 否则既能从左边转移过来也可以从上边转移过来,即 f[i][j] = f[i][j - 1] + f[i - 1][j]

【代码】

class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> f(m, vector<int>(n));f[0][0] = 1;for (int i = 0; i < m; i++)for (int j = 0; j < n; j++){if (i) f[i][j] += f[i - 1][j];if (j) f[i][j] += f[i][j - 1];}return f[m - 1][n - 1];}
};

LeetCode 63. 不同路径 II(中等)

【题目描述】

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start”)。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 10 来表示。

在这里插入图片描述

【示例1】

输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

【示例2】

输入:obstacleGrid = [[0,1],[0,0]]
输出:1

【提示】

m = = o b s t a c l e G r i d . l e n g t h m == obstacleGrid.length m==obstacleGrid.length
n = = o b s t a c l e G r i d [ i ] . l e n g t h n == obstacleGrid[i].length n==obstacleGrid[i].length
1 ≤ m , n ≤ 100 1\le m, n\le 100 1m,n100
obstacleGrid[i][j]01

【分析】


和上一题一样,如果 (i, j) 是障碍物,则 f[i][j] = 0,即没有办法走到这个点。如果起点或者终点是障碍物,那么直接返回 0 0 0 即可。


【代码】

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int n = obstacleGrid.size(), m = obstacleGrid[0].size();if (obstacleGrid[0][0] || obstacleGrid[n - 1][m - 1]) return 0;  // 特判起点或终点就是障碍物的情况vector<vector<int>> f(n, vector<int>(m));f[0][0] = 1;for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)if (!obstacleGrid[i][j])  // 如果是障碍物f[i][j]就为0,直接跳过不计算{if (i) f[i][j] += f[i - 1][j];if (j) f[i][j] += f[i][j - 1];}return f[n - 1][m - 1];}
};

LeetCode 64. 最小路径和(中等)

【题目描述】

给定一个包含非负整数的 m x n 网格 grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。

【示例1】

在这里插入图片描述

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。

【示例2】

输入:grid = [[1,2,3],[4,5,6]]
输出:12

【提示】

m = = g r i d . l e n g t h m == grid.length m==grid.length
n = = g r i d [ i ] . l e n g t h n == grid[i].length n==grid[i].length
1 ≤ m , n ≤ 200 1\le m, n\le 200 1m,n200
0 ≤ g r i d [ i ] [ j ] ≤ 200 0\le grid[i][j]\le 200 0grid[i][j]200

【分析】


这题同样也是数字三角形模型,令 f[i][j] 表示从起点走到 (i, j) 的路径和的最小值,状态转移有如下几种情况:

  • 从上边转移过来,那么结果为从起点走到 (i - 1, j) 的路径和的最小值(f[i - 1][j])加上当前点的值,即 f[i][j] = f[i - 1][j] + grid[i][j]
  • 从左边转移过来同理,转移方程为:f[i][j] = f[i][j - 1] + grid[i][j]

根据 f[i][j] 的定义,我们要求的是最小值,因此最终的状态转移方程为:f[i][j] = min(f[i - 1][j], f[i][j - 1]) + grid[i][j]


【代码】

class Solution {
public:int minPathSum(vector<vector<int>>& grid) {int n = grid.size(), m = grid[0].size();vector<vector<int>> f(n, vector<int>(m, INT_MAX));  // 初始化为正无穷之后便于和自身取minf[0][0] = grid[0][0];for (int i = 0; i < n; i++)for (int j = 0; j < m; j++){if (i) f[i][j] = min(f[i][j], f[i - 1][j] + grid[i][j]);if (j) f[i][j] = min(f[i][j], f[i][j - 1] + grid[i][j]);}return f[n - 1][m - 1];}
};

LeetCode 65. 有效数字(困难)

【题目描述】

有效数字(按顺序)可以分成以下几个部分:

  1. 一个小数或者整数
  2. (可选)一个 'e''E',后面跟着一个整数

小数(按顺序)可以分成以下几个部分:

  1. (可选)一个符号字符('+''-'
  2. 下述格式之一:
    • 至少一位数字,后面跟着一个点 '.'
    • 至少一位数字,后面跟着一个点 '.',后面再跟着至少一位数字
    • 一个点 '.',后面跟着至少一位数字

整数(按顺序)可以分成以下几个部分:

  1. (可选)一个符号字符('+''-'
  2. 至少一位数字

部分有效数字列举如下:["2", "0089", "-0.1", "+3.14", "4.", "-.9", "2e10", "-90E3", "3e+7", "+6e-1", "53.5e93", "-123.456e789"]
部分无效数字列举如下:["abc", "1a", "1e", "e3", "99e2.5", "--6", "-+3", "95a54e53"]

给你一个字符串 s,如果 s 是一个有效数字,请返回 true

【示例1】

输入:s = "0"
输出:true

【示例2】

输入:s = "e"
输出:false

【示例3】

输入:s = "."
输出:false

【提示】

1 ≤ s . l e n g t h ≤ 20 1\le s.length\le 20 1s.length20
s 仅含英文字母(大写和小写),数字(0-9),加号 '+',减号 '-',或者点 '.'

【分析】


本题需要考虑的情况有很多种,我们一个个分析:

  • e/E 的前后如果为空(在第一个或最后一个位置上),返回 false
  • xx. 或者 .xx 都是合法的,但是 .e/E 是不合法的;
  • e/E 的后面如果有 .,返回 false
  • +/- 只可能在首部或者 e/E 的后面出现一次,其余地方出现均不合法;
  • 如果 . 或者 e/E 出现次数大于1次则不合法;
  • e/E 的后面如果是 +/-,还需要判断下一位有没有内容,如果已经到字符串末尾,也是不合法;
  • 其余情况只要不是 0~9 即为不合法。

【代码】

class Solution {
public:bool isNumber(string s) {bool has_dot = false, has_e = false;if (s[0] == '+' || s[0] == '-') s = s.substr(1);if (s.empty()) return false;  // 字符串只有+/-if (s[0] == '.' && (s.size() == 1 || s[1] == 'e' || s[1] == 'E')) return false;for (int i = 0; i < s.size(); i++){if (s[i] == '.'){if (has_dot || has_e) return false;has_dot = true;}else if (s[i] == 'e' || s[i] == 'E'){if (has_e || !i || i == s.size() - 1) return false;  // 不止一次出现E或者出现在第一个或最后一个位置if (s[i + 1] == '+' || s[i + 1] == '-')  // E后面是正负号还需要继续判断{if (i + 1 == s.size() - 1) return false;i++;  // 跳过正负号}has_e = true;}else if (s[i] < '0' || s[i] > '9') return false;}return true;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Neo-reGeorg隧道搭建

目录 Neo-regeorg前言 环境搭建 具体使用 kail安装Neo-reGeorg kail内生成webshell并设置密码 kail与win10连接 windows server内打开服务 kail虚拟机访问windows server以及所在的内网 Neo-regeorg前言 regeorg为reDuh的升级版&#xff0c;主要功能就是把内网服务器的…

IJ中PHP环境的搭建和使用教程

目录 目录 前言 思维导图 1&#xff0c;PHP环境下载 1.下载链接 2.进行安装 3,自定义路径 4.进行相关的一些库的选择下载 2&#xff0c;进行IJ中PHP环境的配置 2.1,下载PHP插件 2.2,下载过程中的注意事项 3&#xff0c;为什么这么做呢? 3.1,原因 3.2,进行代码…

从0开始的ios自动化测试

最近由于工作内容调整&#xff0c;需要开始弄ios自动化了。网上信息有点杂乱&#xff0c;这边我就按我的实际情况&#xff0c;顺便记录下来&#xff0c;看是否能帮到有需要的人。 环境准备 安装tidevice pip3 install -U “tidevice[openssl]”它的作用是&#xff0c;帮你绕…

企业架构LNMP学习笔记28

企业架构LNMP高可用负载均衡服务器之Nginx&#xff1a; 1&#xff09;能够描述负载均衡的作用&#xff1b;loadbalance LB。 2&#xff09;能够了解负载均衡常见的实现方式&#xff1b; 3&#xff09;能够使用nginx实现负载均衡&#xff1b; 4&#xff09;能够描述nginx的常…

上海控安携汽车网络安全新研产品出席AUTOSEMO“恒以致远,共创共赢”主题研讨会

8月31日&#xff0c;AUTOSEMO“恒以致远&#xff0c;共创共赢”主题研讨会在天津成功召开。本次大会由中国汽车工业协会软件分会中国汽车基础软件生态标委会&#xff08;简称&#xff1a;AUTOSEMO&#xff09;与天津市西青区人民政府联合主办。现场汇聚了100余位来自产学研政企…

如何进行SEO优化数据分析?(掌握正确的数据分析方法,让您的网站更上一层楼!)

在互联网时代&#xff0c;SEO优化已经成为了每一个网站运营者必备的技能。而在SEO优化中&#xff0c;数据分析更是至关重要的一环。在本文中&#xff0c;我们将会详细介绍如何正确的进行SEO优化数据分析&#xff0c;让您的网站更上一层楼&#xff01; 数据分析的重要性 数据分…

网络原理(二)TCP的可靠传输

网络原理&#xff08;一&#xff09;目录 网络原理应用层传输层先说UDP&#xff08;不可靠传输&#xff09;重点说明&#xff34;&#xff23;&#xff30;&#xff08;可靠传输&#xff09;一、确认应答二、超时重传三、链接管理建立连接断开链接 四、滑动窗口五、流量控制&am…

rocky(centos) 安装redis,并设置开机自启动

一、下载并安装 1、官网下载Redis 并安装 Download | RedisRedisYou can download the last Redis source files here. For additional options, see the Redis downloads section below.Stable (7.2)Redis 7.2 …https://redis.io/download/ 2、上传下载好的redis压缩包到 /…

k8s 搭建基于session模式的flink集群

1.flink集群搭建 不废话直接上代码&#xff0c;都是基于官网的&#xff0c;在此记录一下 Kubernetes | Apache Flink flink-configuration-configmap.yaml apiVersion: v1 kind: ConfigMap metadata:name: flink-configlabels:app: flink data:flink-conf.yaml: |jobmanager…

【Vue篇】Vue 项目下载、介绍(详细版)

如何创建一个vue项目&#xff1f;首先要有环境&#xff0c;如下&#xff1a; nodejs vue-cli如果有以上的工具就直接跳过安装教程 【Vue篇】mac上Vue 开发环境搭建、运行Vue项目&#xff08;保姆级&#xff09; 创建vue项目 选择一个位置&#xff0c;你要存放项目的路径&…

海保人寿:开源治理保障科技与保险融合,助力保险业务数字化改革创新

海保人寿保险股份有限公司&#xff08;简称“海保人寿”&#xff09;是第一家在海南筹建开业的全国性保险机构。从成立之初&#xff0c;便深耕于数字化创新&#xff0c;在自身多业务环节中实现数字化转型&#xff0c;依托优秀的研发体系与数智融合的业务系统&#xff0c;不断推…

RocketMQMessageListener使用错误问题分析与排查

背景 RocketMQ与SpingBoot相结合可以大大降低我们开发的复杂度&#xff0c;但是最近在一个新项目中使用RocketMQMessageListener 监听消息&#xff0c;导致消费者启动失败&#xff0c;提示该消费组已经被创建了&#xff0c;请重新申请一个消费者组。 Caused by: org.apache.r…

【深度学习】 Python 和 NumPy 系列教程(三):Python容器:1、列表List详解(初始化、索引、切片、更新、删除、常用函数、拆包、遍历)

目录 一、前言 二、实验环境 三、Python容器&#xff08;Containers&#xff09; 0、容器介绍 1、列表&#xff08;List&#xff09; 1. 初始化 a. 创建空列表 b. 使用现有元素初始化列表 c. 使用列表生成式 d. 复制列表 2. 索引和切片 a. 索引 b. 负数索引 c. 切…

龙迅LT86102UX HDMI一进二出,支持分辨率4K60HZ

龙迅LT86102UXE 1. 描述 龙迅LT86102UX HDMI2.0 分路器具有符合 HDMI2.0/1.4 规范的 1&#xff1a;2 分路器、最大 6Gbps 高速数据速率、自适应均衡 RX 输入和预强调的 TX 输出&#xff0c;支持长电缆应用&#xff0c;板载无 XTAL&#xff0c;可节省 BOM 成本。 LT86102UX HDM…

【Linux】- Linux下搭建Java环境[IDEA,JDK8,Tomcat]

Java环境 1. 安装JDK2.安装tomcat3.安装idea4. 安装MySQL5.7 1. 安装JDK /usr/local&#xff1a;存放用户自行安装的软件&#xff0c;默认情况下不会被系统软件包管理器管理 发现解压后的文件已经整体移动到/usr/local/java 文件夹下 打开bin目录&#xff0c;可以看到java的版…

Nginx参数配置详细说明【全局、http块、server块、events块】【已亲测】

Nginx重点参数配置说明 本文包含Nginx参数配置说明全局块、http块、server块、events块共计30多个参数配置与解释&#xff0c;其中常见参数包含配置错误出现的错误日志&#xff0c;能让你更快的解决问题。 该文的所有参数大部分经过单独测试&#xff0c;错误都是自己收集出来的…

每日刷题-3

目录 一、选择题 二、编程题 1、计算糖果 2、进制转换 一、选择题 1、 解析&#xff1a;在C语言中&#xff0c;以0开头的整数常量是八进制的&#xff0c;而不是十进制的。所以&#xff0c;0123的八进制表示相当于83的十进制表示&#xff0c;而123的十进制表示不变。printf函数…

(翻译)JavaFX高级教程:JavaFX2.0的FXML语言

原文地址http://download.oracle.com/javafx/2.0/fxml_get_started/jfxpub-fxml_get_started.htm FXML是JavaFX 2.0新引入的。你可能会问"What is FXML?" 和"Is FXML for me?" FXML 是基于XML的一种声明性标记语言&#xff0c;用来定义应用的用户接口。F…

QT设计一个小闹钟

设置一个闹钟&#xff0c;左侧窗口显示当前时间&#xff0c;右侧设置时间&#xff0c;以及控制闹钟的开关&#xff0c;下方显示闹钟响时的提示语。当按启动按钮时&#xff0c;设置时间与闹钟提示语均不可再改变。当点击停止时&#xff0c;关闭闹钟并重新启用设置时间与闹钟提示…

【MySQL】详解聚合查询、多表查询

MySQL 增删查改&#xff08;进阶&#xff09; 文章目录 MySQL 增删查改&#xff08;进阶&#xff09;01 表的设计表的三大范式 02 查询操作进阶新增聚合查询countsumavgmaxmin 分组查询 GROUP BYHAVING 联合查询/多表查询关键思路引入内连接外连接左外连接&#xff1a;left joi…