【CodeTop】TOP 100 刷题 51-60
文章目录
- 51. 缺失的第一个正数
- 题目描述
- 代码与解题思路
- 52. 训练计划 II
- 题目描述
- 代码与解题思路
- 53. 子集
- 题目描述
- 代码与解题思路
- 54. 最小覆盖子串
- 题目描述
- 代码与解题思路
- 55. 从前序与中序遍历序列构造二叉树
- 题目描述
- 代码与解题思路
- 56. 零钱兑换
- 题目描述
- 代码与解题思路
- 57. 最小栈
- 题目描述
- 代码与解题思路
- 58. 最长有效括号
- 题目描述
- 代码与解题思路
- 59. 反转字符串中的单词
- 题目描述
- 代码与解题思路
- 60. 字符串相乘
- 题目描述
- 代码与解题思路
51. 缺失的第一个正数
题目链接:41. 缺失的第一个正数
题目描述
代码与解题思路
func firstMissingPositive(nums []int) int {for i := 0; i < len(nums); i++ {for nums[i] > 0 && nums[i] <= len(nums) && nums[i] != nums[nums[i]-1] {nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]}}for i := 0; i < len(nums); i++ {if nums[i] != i+1 {return i+1}}return len(nums)+1
}
这道题不难做,难在怎么用 O(N) 的时间复杂读和 O(1) 的空间复杂度来做,如果忽略这两个条件,可以用排序二分,可以用哈希存储
而想要达成这个复杂度的目标,就必须用原地哈希来做,而具体思路就是这个哥们的神之比喻:
52. 训练计划 II
题目链接:LCR 140. 训练计划 II
题目描述
代码与解题思路
func trainingPlan(head *ListNode, cnt int) *ListNode {slow, fast := head, headfor fast != nil && cnt > 0 {fast = fast.Nextcnt--}for fast != nil {slow = slow.Nextfast = fast.Next}return slow
}
这道题刷的次数太多太多,一看到 DNA 都动了,直接快慢指针,fast 先走 cnt 步,然后再一起走就行了。
53. 子集
题目链接:78. 子集
题目描述
代码与解题思路
func subsets(nums []int) (ans [][]int) {tmp := []int{}var dfs func(int)dfs = func(start int) {ans = append(ans, append([]int(nil), tmp...))for i := start; i < len(nums); i++ {tmp = append(tmp, nums[i])dfs(i+1)tmp = tmp[:len(tmp)-1]}}dfs(0)return ans
}
经典的 dfs 模板题,求子集;还有一个模板是 dfs 求全排列,前段时间刷过。
54. 最小覆盖子串
题目链接:76. 最小覆盖子串
题目描述
代码与解题思路
func minWindow(s string, t string) string {if len(s) < len(t) {return ""}win := map[byte]int{}cmp := map[byte]int{}// 初始化 cmpfor i, _ := range t {cmp[t[i]]++}start, end, match, minLen := 0, 0, 0, 100010for left, right := -1, 0; right < len(s); right++ {// 1. 将 s[right] 加入区间ch1 := s[right]win[ch1]++// 2. 更新状态if win[ch1] == cmp[ch1] {match++}// 3. 满足条件, 出窗口for match == len(cmp) {// 更新窗口长度的最小值if right - left < minLen {start, end = left, rightminLen = right - left}// 出窗口, 更新状态left++ch2 := s[left]if win[ch2] == cmp[ch2] {match--}win[ch2]--}}return s[start+1:end+1]
}
这道题是典型的比较复杂的滑动窗口题目,考察对细节的把控,以及对滑动窗口算法思想的掌握程度,省流:考察基本功,我现在基本功也不够扎实,希望下一次能轻松写出这道题目
55. 从前序与中序遍历序列构造二叉树
题目链接:105. 从前序与中序遍历序列构造二叉树
题目描述
代码与解题思路
func buildTree(preorder []int, inorder []int) *TreeNode {if len(preorder) == 0 {return nil}root := &TreeNode{preorder[0], nil, nil}i := 0for i = 0; i < len(inorder); i++ { // 找到与前序遍历数对应的中序遍历数if inorder[i] == preorder[0] {break}}root.Left = buildTree(preorder[1:len(inorder[:i])+1], inorder[:i]) // 构建左子树root.Right = buildTree(preorder[len(inorder[:i])+1:], inorder[i+1:]) // 构建右子树return root
}
这道题目的关键是得知道怎么用前序遍历和中序遍历的性质推出一棵树,只需要知道这一点,这道题就很好做了,具体来说就是根据两个性质:
- 前序遍历数组的第一个数就是根节点
- 中序遍历数组的数,在左边的就是在他的左子树,在右边就是在他的右子树,举个例子:
根节点 3,中序数组中,9 在 3 的左边,所以他在左子树,剩下的其他节点在右边,所以他们是右子树。
根据这两个性质,就能推出一整棵树了,也通过这个性质来构建一颗树。
56. 零钱兑换
题目链接:322. 零钱兑换
题目描述
代码与解题思路
func coinChange(coins []int, amount int) int {dp := make([]int, amount+1)for i, _ := range dp {dp[i] = math.MaxInt}dp[0] = 0for i := 0; i < len(coins); i++ {for j := coins[i]; j <= amount; j++ {if dp[j-coins[i]] != math.MaxInt {dp[j] = min(dp[j], dp[j-coins[i]]+1)}} }if dp[amount] != math.MaxInt {return dp[amount]}return -1
}
我背包问题没怎么学明白,看的这个哥们的思路:https://leetcode.cn/problems/coin-change/discussion/comments/79896
57. 最小栈
题目链接:155. 最小栈
题目描述
代码与解题思路
这道题真的只有做过才能想的出来,虽然我之前做过一次,但是现在已经忘记了,所以就先凭感觉刷了一遍;
type MinStack struct {arr []int min int
}func Constructor() MinStack {return MinStack{arr: []int{},min: math.MaxInt,}
}func (this *MinStack) Push(val int) {if this.min > val {this.min = val}this.arr = append(this.arr, val)
}func (this *MinStack) Pop() {top := this.arr[len(this.arr)-1]this.arr = this.arr[:len(this.arr)-1]if top == this.min {minVal := math.MaxIntfor _, v := range this.arr {minVal = min(minVal, v)}this.min = minVal}
}func (this *MinStack) Top() int {return this.arr[len(this.arr)-1]
}func (this *MinStack) GetMin() int {return this.min
}
O(1) 取最小,O(N) 维护
之后看了一下官方题解,记忆回归:
type MinStack struct {st1 []intst2 []int
}func Constructor() MinStack {return MinStack {st1: []int{},st2: []int{math.MaxInt},}
}func (t *MinStack) Push(val int) {t.st1 = append(t.st1, val)t.st2 = append(t.st2, min(t.st2[len(t.st2)-1], val))
}func (t *MinStack) Pop() {t.st1 = t.st1[:len(t.st1)-1]t.st2 = t.st2[:len(t.st2)-1]
}func (t *MinStack) Top() int {return t.st1[len(t.st1)-1]
}func (t *MinStack) GetMin() int {return t.st2[len(t.st2)-1]
}
官方给定的方法是,维护两个栈,一个栈正常放值,正常出值;另一个最小栈每次入栈都是最小值
58. 最长有效括号
题目链接:32. 最长有效括号
题目描述
代码与解题思路
用栈模拟:
func longestValidParentheses(s string) (ans int) {st := []int{-1}for i, v := range s {if v == '(' {st = append(st, i)} else { // v == ')'st = st[:len(st)-1]if len(st) > 0 { // 栈不为空, 更新最大长度ans = max(ans, i - st[len(st)-1])} else { // 栈为空, 将')'对应的索引入栈作为新的参照物st = append(st, i)}}}return ans
}
核心思想:
- 保留一个参照位置,通过当前索引值 - 参照位置的索引求出最长括号的长度,参照位置初识为 -1,之后为初识位置的前一个位置
- 当 v == ‘(’ 时入栈,遇到 ‘)’ 出栈匹配,并更新最长长度,当遇到 ‘)’ 而没有 ‘(’ 匹配的话,就让它作为新的参照物
其实还有动态规划的解法,但是对我现在来说太难了
59. 反转字符串中的单词
题目链接:151. 反转字符串中的单词
题目描述
代码与解题思路
func reverseWords(s string) string {s = strings.TrimSpace(s)left, right := len(s)-1, len(s)-1resSlice := make([]string, 0)for left >= 0 {// left 找单词左边界for left >= 0 && s[left] != ' ' {left--}resSlice = append(resSlice, s[left+1:right+1])// left 跳过空格for left >= 0 && s[left] == ' ' {left--}right = left}return strings.Join(resSlice, " ")
}
这道题主要是用了 s = strings.TrimSpace(s),以及 strings.Join(resSlice, " ") 两个字符串相关的 api,之后我会总结一份 Golang 专属的刷算法 api 库,到时候会收录进去的
60. 字符串相乘
题目链接:43. 字符串相乘
题目描述
代码与解题思路
func multiply(num1 string, num2 string) string {if num1 == "0" || num2 == "0" {return "0"}ans := "0"m, n := len(num1), len(num2)for i := n - 1; i >= 0; i-- {curr := ""add := 0for j := n - 1; j > i; j-- { // 竖式乘法, 每乘一个数后面会多一个 0curr += "0"}y := int(num2[i] - '0')for j := m - 1; j >= 0; j-- {x := int(num1[j] - '0')product := x * y + addcurr = strconv.Itoa(product % 10) + curr // 把新计算的数拼接到 curr 前面add = product / 10}if add != 0 { // 处理最后一次进位curr = strconv.Itoa(add % 10) + curr}ans = addStrings(ans, curr)}return ans
}func addStrings(num1, num2 string) string { // 竖式乘法的每一轮相加i, j := len(num1) - 1, len(num2) - 1add := 0ans := ""for ; i >= 0 || j >= 0 || add != 0; i, j = i - 1, j - 1 {x, y := 0, 0if i >= 0 {x = int(num1[i] - '0')}if j >= 0 {y = int(num2[j] - '0')}result := x + y + addans = strconv.Itoa(result % 10) + ansadd = result / 10}return ans
}
这道题不简单,但并不是不能做,一定要做好分析,正确的模拟竖式乘法的过程,主要是分为两个步骤,一个是对竖式乘法每一行乘积的模拟,一个是将竖式乘法每一行的乘积相加的模拟,把这两个核心步骤实现了,这道题目就做出来了
考察的是对字符串操作和代码的把控能力,现在我的代码把控能力还没有非常的强,我希望寒假的这一个月能有一个不小的进步
相关文章:

【CodeTop】TOP 100 刷题 51-60
文章目录 51. 缺失的第一个正数题目描述代码与解题思路 52. 训练计划 II题目描述代码与解题思路 53. 子集题目描述代码与解题思路 54. 最小覆盖子串题目描述代码与解题思路 55. 从前序与中序遍历序列构造二叉树题目描述代码与解题思路 56. 零钱兑换题目描述代码与解题思路 57. …...

k8s的图形化工具---rancher
rancher是一个开源的企业级多集群的k8s管理平台。 rancher和k8s的区别:都是为了容器的调度和编排系统。但是rancher不仅可以调度还可以管理整个k8s集群。 rancher自带监控(普罗米修斯) 实验部署 master01 20.0.0.32 node01 20.0.0.34 node02 20.0.0.35 test …...

npm安装卡住问题(最新版)
npm安装卡住问题(最新版) 背景: 最近这两天用npm安装一些包的时候,发现一直卡住: 报错: idealTree:npm: sill idealTree buildDeps之前能用的现在不能用了,我一想,是不是源头的问题,还真是…...

什么是线程死锁
死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资 源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推 进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相…...

Django从入门到精通(二)
目录 三、视图 3.1、文件or文件夹 3.2、相对和绝对导入urls 3.3、视图参数requests 3.4、返回值 3.5、响应头 3.6、FBV和CBV FBV 四、静态资源 4.1、静态文件 4.2、媒体文件 五、模板 5.1、寻找html模板 5.2、模板处理的本质 5.3、常见模板语法 5.4、内置模板函…...

建筑物防雷检测安全接地应用解决方案
雷电是一种自然现象,具有极高的电压和电流,对建筑物及其内部设备、人员和财产可能造成严重的危害,如火灾、爆炸、电击、电磁干扰等。因此,建筑物必须采取有效的防雷措施,以保障建筑物的安全和可靠运行。建筑物防雷检测…...

支付宝小程序开发踩坑笔记(支付宝、学习强国小程序)
1、接口请求安卓端回调 success,IOS 端回调 fail 原因:dataType 设置不对,默认是 json 格式,对返回数据会进行 json 解析,如果解析失败,就会回调 fail 。加密传输一般是 text 格式。 2、input 禁止输入空格…...

如何降低微服务复杂度丨云栖大会微服务主题分享实录
作者:谢吉宝 本文整理自阿里云资深技术专家、中间件负责人谢吉宝在2023云栖大会《极简微服务模式,降低微服务复杂度的最佳实践》的分享 2023 云栖大会现场 当面临复杂的挑战时,"分而治之"的方法往往能取得显著的效果。微服务架构…...

openresty 安装, nginx与 openresty
openresty VS nginx Nginx 是一款高性能的 Web 服务器和反向代理服务器,具备基础的功能如HTTP服务、负载均衡、反向代理以及动静分离等。它是许多互联网应用的核心组件,因其模块化和可扩展的设计而受到欢迎。1 OpenResty 是基于 Nginx 的 Web 平台&…...
puppeteer实现截图
Window服务器说明 1.在本地安装 puppeteer 先创建一个本地文件夹puppeteer,我的地址D:\common_workspace\puppeteer 然后使用cmd打开这个文件夹所在位置,再执行如下两条命令即可。 npm install -g cnpm --registryhttps://registry.npm.taobao.orgcnpm …...

【2024Java面试突击】并发编程、线程池面试实战
前言 最近在更新面试突击专栏,我把每一篇将字数都尽量控制在 2000 字以内,可能在文章里边写的没有那么细致,主要是提供一些 问题 以及 回答的思路 ,以及 面试中可能忽略的漏洞 ,所以在看完文章之后,如果自…...

ASUS华硕无畏Pro15笔记本电脑(M6500QB,M6500QH)工厂模式原厂OEM预装Windows11.22H2系统 含Recovery恢复
原装出厂Windows11系统适用于华硕无畏15笔记本电脑型号:M6500QB和M6500QH 链接:https://pan.baidu.com/s/1AVGLN6-ILIRogOMj48Mk1w?pwdmi7d 提取码:mi7d 带有ASUS RECOVERY恢复功能、自带所有驱动、出厂主题专用壁纸、系统属性联机支持…...
代码随想录算法训练营第三十天|51. N皇后
|51. N皇后 public List<List<String>> solveNQueens(int n) {List<List<String>> res new ArrayList<>();return null;}void backtracking1(int n, int row, int[] columns) {// 是否在所有n行里都摆放好了皇后?if (row n) {count;// 找到了…...

Kubernetes(K8S)各种攻击方法
1. 准备工作 1.1. metarget使用 项目地址(教程):https://github.com/Metarget/metarget/blob/master/README-zh.md 注意:推荐在Ubuntu 18.04(推荐)安装。 1.1.1. 安装metarget git clone https://github.com/Metarget/metarget.git cd metarget/ sudo apt install pyt…...

【MySQL】内外连接
内外连接 一、内连接二、外连接1、左外连接2、右外连接 表的连接分为内连和外连。 一、内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选。只不过为了让sql的可读性更好,我们使用其他的关键字进行内连接。 语法: SELECT ... FRO…...

selenium执行出现异常,SessionNotCreatedException ChromeDriver only supports
问题现状: 运行程序报错: selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 114 Current browser version is 121.0.6167.85 with binary path /App…...

Flink:快速掌握批处理数据源的创建方法
Flink 社区最近 “基于FLIP-27” 设计了新的 Source 框架 。一些连接器(API)已迁移到这个新框架。本文介绍了如何使用这个新框架创建批处理源。 它是在为Cassandra实现Flink 批处理源时构建的。如果您有兴趣贡献或迁移连接器,这篇文章非常适合…...

基于cubeMX的正点原子miniSTM32对W25Q64的存储使用
一、实现目标 使用cubeMX建立项目工程,结合正点原子提供的hal库对W25Q64闪存调用的例程,实现W25Q64的读写。 二、实现过程 1、首先建立cubeMX工程,其他项设置不再叙述,只看连接W25Q64的SPI设置,这里使用SPI1…...
C++笔记(三)
封装意义: 在设计类的时候,属性和行为写在一起,表现事物 类在设计时,可以把属性和行为放在不同的权限下,加以控制。 访问权限有三种: public 公共 类内 类外都可以访问, protected保护 类内可以访问…...
c语言不定参数
时间记录:2024/1/22 一、不定参数的函数定义和使用到的c函数 (1)定义 void fun1(参数类型 argName,...); 示例: void fun1(int count,...);(2)获取不定参数的值 #include <stdarg.h> //包含头文件…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...