【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.mzph.cn/news/69957.shtml

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

相关文章

py脚本解决ArcGIS Server服务内存过大的问题

在一台服务器上&#xff0c;使用ArcGIS Server发布地图服务&#xff0c;但是地图服务较多&#xff0c;在发布之后&#xff0c;服务器的内存持续处在95%上下的高位状态&#xff0c;导致服务器运行状态不稳定&#xff0c;经常需要重新启动。重新启动后重新进入这种内存高位的陷阱…

回复:c#的Winform如何让ComboBox不显示下拉框?https://bbs.csdn.net/topics/392565412

组合框.Parent this;组合框.Items.AddRange(new object[] { "111", "222", "333", "444" });组合框.DropDownHeight 1;组合框.SelectedIndex 0;//组合框.DropDownStyle ComboBoxStyle.Simple; ComboBox 组合框 new ComboBox();Li…

51单片机电子钟六位数码管显示整点提醒仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

51单片机电子钟六位数码管显示整点提醒仿真设计( proteus仿真程序原理图报告讲解视频&#xff09; 1.主要功能&#xff1a;2.仿真3. 程序代码4. 原理图参考元器件清单 5. 设计报告6. 设计资料内容清单 51单片机电子钟六位数码管显示整点提醒仿真设计( proteus仿真程序原理图报告…

[HDCTF 2023]YamiYami

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言涉及知识点解题详细过程session伪造反弹shell 前言 从暑假末尾一直搁置&#xff0c;当时卡在反弹shell搞得离flag就差一步。不过最近一两天学习完反弹shell的知…

8.(Python数模)(预测模型一)马尔科夫链预测

Python实现马尔科夫链预测 马尔科夫链原理 马尔科夫链是一种进行预测的方法&#xff0c;常用于系统未来时刻情况只和现在有关&#xff0c;而与过去无关。 用下面这个例子来讲述马尔科夫链。 如何预测下一时刻计算机发生故障的概率&#xff1f; 当前状态只存在0&#xff08;故…

虚拟机扩容

系统环境centos8&#xff0c;分两步&#xff0c;第一步先在vmware扩容&#xff0c;第二部在虚拟机内部扩容 1.vmware分配磁盘空间 2.虚拟机内部扩容 查看当前磁盘信息&#xff0c;这个是扩容之前的&#xff0c;扩容完成才会显示新的 df -h查看系统分区信息 fdisk -l查看目录…

C语言基础知识理论版(很详细)

文章目录 前述一、数据1.1 数据类型1.2 数据第一种数据&#xff1a;常量第二种数据&#xff1a;变量第三种数据&#xff1a;表达式1、算术运算符及算术表达式2、赋值运算符及赋值表达式3、自增、自减运算符4、逗号运算符及其表达式&#xff08;‘顺序求值’表达式&#xff09;5…

Spring Boot日志基础使用 设置日志级别

然后 我们来说日志 日志在实际开发中还是非常重要的 即可记录项目状态和一些特殊情况发生 因为 我们这里不是将项目 所以 讲的也不会特别深 基本还是将Spring Boot的日志设置或控制这一类的东西 相对业务的领域我们就不涉及了 日志 log 初期最明显的作用在于 开发中 你可以用…

深入浅出了解BeanFactory 和 ApplicationContext

一.区别 BeanFactory和ApplicationContext是Spring的两大核心接口&#xff0c;都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。 1.依赖关系 BeanFactory&#xff1a;是Spring里面最底层的接口&#xff0c;包含了各种Bean的定义&#xff0c;读取bean…

Mac 手动安装 sshpass

1. 下载安装包 https://sourceforge.net/projects/sshpass/ 解压并进入到安装包目录 tar -zxvf sshpass-xx.xx.tar.gz cd sshpass-xx.xx2. 检验环境&#xff0c;编译源码安装 ./configuremake&&make install3. 检测安装是否成功 ▶ sshpass Usage: sshpass [-f|-…

Golang专题精进

Golang专题精进 Golang单元测试Golang错误处理Golang正则表达式Golang反射Golang验证码Golang日期时间处理库CarbonGolang发送邮件库emailGolang log日志Golang log日志框架logrusGolang加密和解密应用Golang访问权限控制框架casbinGolang使用swagger生成api接口文档Golang jwt…

Vue + Element UI 实现权限管理系统 前端篇(十四):菜单功能实现菜

Vue Element UI 实现权限管理系统 前端篇&#xff08;十四&#xff09;&#xff1a;菜单功能实现 菜单功能实现 菜单接口封装 菜单管理是一个对菜单树结构的增删改查操作。 提供一个菜单查询接口&#xff0c;查询整颗菜单树形结构。 http/modules/menu.js 添加 findMenu…

uniapp 解决跨域的问题

uniapp 解决跨域的问题 我真的是个 沙雕 找对了解决办法 写错了地方 "h5" : {"devServer" : {"disableHostCheck" : true,"https": false,"proxy" : {"/app" : {"target" : "https://192.16…

MRI多任务技术及应用

目录 一、定量心血管磁共振成像&#xff08;CMR&#xff09;的改进方法二、磁共振多任务三、磁共振多任务的成像框架四、磁共振多任务的图像模型和采样和重建策略五、利用MR多任务进行快速三维稳态CEST(ss-CEST)成像5.1 利用MR多任务进行快速三维稳态CEST(ss-CEST)成像介绍5.2 …

Java调用Web Service接口

方法1. 用IDEA生成相关代码调用方法。 在IDEA插件商店下载插件 然后新建一个Java项目 创建一个包来存放生成的代码&#xff0c;(点击一下)选中这个包&#xff0c;点击Tools 填入接口url&#xff0c;记住后面拼接“?wsdl”&#xff0c;选择生成方法&#xff0c;然后OK即可生…

超详解| Yolov8模型手把手调参 | 配置 | 模型训练 | 验证 | 推理

YOLOv8是一款前沿、最先进&#xff08;SOTA&#xff09;的模型&#xff0c;基于先前YOLO版本的成功&#xff0c;引入了新功能和改进&#xff0c;进一步提升性能和灵活性。 然而&#xff0c;要充分发挥Yolov8的潜力&#xff0c;合理的参数配置是至关重要的。本文将带您深入了解…

stable diffusion实践操作-VAE

系列文章总目录 stable diffusion实践操作 文章目录 系列文章总目录一、 前言1 定义功能全局介绍2 模型全局介绍2.1 后缀以及存放位置2.2 查看大模型是否有VAE 二、正文1 原理1.1 基础原理 2 使用2.1 增加饱和度2.2 增加细节 3 下载3.1 自动下载3.2 手动下载 三 、总结 一、 前…

掌握逻辑漏洞复现技术,保护您的数字环境

环境准备 这篇文章旨在用于网络安全学习&#xff0c;请勿进行任何非法行为&#xff0c;否则后果自负。 1、支付逻辑漏洞 攻击相关介绍 介绍&#xff1a; 支付逻辑漏洞是指攻击者利用支付系统的漏洞&#xff0c;突破系统的限制&#xff0c;完成非法的支付操作。攻击者可以采…

从0到1构建界面设计系统思维

用户界面&#xff08;UI&#xff09;是人与机器之间发生交互的载体&#xff0c;也是用户体验&#xff08;UX&#xff09;的一个组成部分。用户界面由两个主要部分组成&#xff1a;视觉设计&#xff08;即传达产品的外观和感觉&#xff09;和交互设计&#xff08;即元素的功能和…

实现SSE的textevent-stream是什么?和applicationoctet-stream有什么区别?

WEB通讯技术。前端实现SSE长连接&#xff0c;nodejsexpress搭建简单服务器&#xff0c;进行接口调试&#xff0c;通过curl请求数据 点击上面的地址是可以了解轮询和长轮询以及websocket等通信模式&#xff0c;一些基础概念和速成技能&#xff0c;这篇来接着详细聊聊text/event…