【CodeTop】TOP 100 刷题 51-60

news2024/12/23 14:58:34

文章目录

  • 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, head
    for fast != nil && cnt > 0 {
        fast = fast.Next
        cnt--
    }
    for fast != nil {
        slow = slow.Next
        fast = 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{}
    
    // 初始化 cmp
    for i, _ := range t {
        cmp[t[i]]++
    }

    start, end, match, minLen := 0, 0, 0, 100010
    for 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, right
                minLen = 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 := 0
    for 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
}

这道题目的关键是得知道怎么用前序遍历和中序遍历的性质推出一棵树,只需要知道这一点,这道题就很好做了,具体来说就是根据两个性质:

  1. 前序遍历数组的第一个数就是根节点
  2. 中序遍历数组的数,在左边的就是在他的左子树,在右边就是在他的右子树,举个例子:
    根节点 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] = 0
    for 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.MaxInt
        for _, 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 []int
    st2 []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. 保留一个参照位置,通过当前索引值 - 参照位置的索引求出最长括号的长度,参照位置初识为 -1,之后为初识位置的前一个位置
  2. 当 v == ‘(’ 时入栈,遇到 ‘)’ 出栈匹配,并更新最长长度,当遇到 ‘)’ 而没有 ‘(’ 匹配的话,就让它作为新的参照物

其实还有动态规划的解法,但是对我现在来说太难了

59. 反转字符串中的单词

题目链接:151. 反转字符串中的单词

题目描述

代码与解题思路

func reverseWords(s string) string {
    s = strings.TrimSpace(s)
    left, right := len(s)-1, len(s)-1
    resSlice := 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 := 0
        for j := n - 1; j > i; j-- { // 竖式乘法, 每乘一个数后面会多一个 0
            curr += "0"
        }
        y := int(num2[i] - '0')
        for j := m - 1; j >= 0; j-- {
            x := int(num1[j] - '0')
            product := x * y + add
            curr = 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) - 1
    add := 0
    ans := ""
    for ; i >= 0 || j >= 0 || add != 0; i, j = i - 1, j - 1 {
        x, y := 0, 0
        if i >= 0 {
            x = int(num1[i] - '0')
        }
        if j >= 0 {
            y = int(num2[j] - '0')
        }
        result := x + y + add
        ans = strconv.Itoa(result % 10) + ans
        add = result / 10
    }
    return ans
}

这道题不简单,但并不是不能做,一定要做好分析,正确的模拟竖式乘法的过程,主要是分为两个步骤,一个是对竖式乘法每一行乘积的模拟,一个是将竖式乘法每一行的乘积相加的模拟,把这两个核心步骤实现了,这道题目就做出来了

考察的是对字符串操作和代码的把控能力,现在我的代码把控能力还没有非常的强,我希望寒假的这一个月能有一个不小的进步

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

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

相关文章

如何生成漂亮的静态文档说明页

分享&#xff1a;如何生成漂亮的静态文档说明页 最近经常被问 https://t.itmuch.com/doc.html 文档页是怎么制作的&#xff0c;考虑到步骤略复杂&#xff0c;写篇手记总结下吧。 TIPS https://t.itmuch.com/doc.html 是个人在慕课网视频《 面向未来微服务:Spring Cloud Alibab…

3.7V升5V 12V 24V 30V 24V/5A升压恒压芯片-H6922

升压恒压芯片是一种电源管理集成电路&#xff0c;其主要功能是将输入电压提升到稳定的输出电压。以下是升压恒压芯片的一些优点&#xff1a; 稳定输出电压&#xff1a;升压恒压芯片能够确保输出电压维持在一个恒定的水平&#xff0c;不受输入电压波动的影响。这有助于提供稳定的…

数字图像处理(实践篇)二十九 OpenCV-Python在图像中检测矩形、正方形和三角形的实践

目录 1 方案 2 实践 1 方案 ①检测矩形和正方形 ⒈检测图像中的所有轮廓。 ⒉循环检查所有检测到的轮廓。 ⒊为每个轮廓找到近似的轮廓。如果近似轮廓中的顶点数为4,则计算宽高比用来区分矩形和正方形。如果宽高比在0.9到1.1之间,则认为为正方形,否则的话,则为矩形。…

Pyecharts绘图

文章目录 柱状图折线图饼图组合图 柱状图 #柱状图 from pyecharts.charts import Bar from pyecharts import options as opts #去掉警告信息 import pyecharts pyecharts.globals._WarningControl.ShowWarning False # 数据 cate t1[行政区].tolist() data1 t1[单价].tolist…

引领AI变革:边缘计算与自然语言处理结合的无尽可能

引言 讲到Ai&#xff0c;你第一时间会想到什么&#xff1f;是Chagpt和文心一言这样与人类交流自然的Ai生成式对话服务&#xff1f;还是根据关键字快速制图的Ai绘图&#xff1f;这些都是近年来人们所常知的Ai用途&#xff0c;我们今天来讲讲以自然语言处理为辅&#xff0c;在Ai赋…

java web 校园健康管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web校园健康管理系统是一套完善的java web信息管理系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysq…

Linux命令-systemctl

一、systemctl命令简介 CentOS 5使用SysV init&#xff1b;CentOS 6使用Upstart&#xff0c;CentOS 7使用Systemd管理守护进程。centos7采用 systemd管理&#xff0c;服务独立的运行在内存中&#xff0c;服务响应速度快&#xff0c;但占用更多内存。独立服务的服务启动脚本都在…

PFEA113-65 3BSE050092R65

PFEA113-65 3BSE050092R65 PFEA113-65 3BSE050092R65 言简意赅的简历最受名企欢迎 "... 受欢迎 采访对象&#xff1a;ABB&#xff08;中国&#xff09;有限责任公司 人力资源经理唐炜女士 ABB是根据每个职位的岗位描述和 ... ; 对于应届毕业生的简历&#x…

新能源、新智造、新技术、新未来2024上海国际氢能产业展览会7月魔都开展!

氢能作为一种来源丰富、绿色低碳、应用广泛的二次能源&#xff0c;是实现可再生能源大规模消纳&#xff0c;电网大规模调峰和跨季节、跨地域储能的重要途径&#xff0c;对构建我国新型电力系统和实现碳达峰碳中和目标具有重要意义。 为落实国家关于发展氢能产业的决策部署&…

BGP路由反射-数据中心IDC项目经验

一、背景描述 R1,R2,R3在AS200区域内&#xff0c;R1和R2,R1和R3建立OSPF&#xff0c;宣告接口互联. AS200区域内&#xff0c;R1和R2建立IBGP, R1和R3建立IBGP R2和R4建立EBGP, R3和R5建立EBGP。 网络拓扑&#xff1a; 二、故障现象 R1和R2可以收到来自AS100区域R4的E…

臻于至善,CodeArts Snap 二维绘图来一套不?

前言 我在体验 华为云的 CodeArts Snap 时&#xff0c;第一个例子就是绘制三角函数图像&#xff0c;功能注释写的也很简单。 业务场景中&#xff0c;有一类就是需要产出各种二维图形的&#xff0c;比如&#xff0c;折线图、散点图、柱状图等。 为了提前积累业务素材&#xf…

cocos creator 碰撞系统

设置碰撞组件 * 添加组件中添加碰撞组件 3种组件类型&#xff0c;矩形碰撞&#xff0c;圆形碰撞&#xff0c; 多边形碰撞 开启碰撞检测 start() {//开启碰撞管理器let cm cc.director.getCollisionManager()cm.enabled true//绘制碰撞检测边界线。用于调试cm.enabledDebug…

SpringCloud Alibaba Sentinel 与 SpringCloud Gateway 的限流有什么差别?(三种限流算法原理分析)

目录 一、Sentinel 与 Gateway 的限流有什么差别&#xff1f; 1.1、前置知识 - 四种常见的限流算法 1.1.1、Tips 1.1.2、计数器算法 1&#xff09;固定窗口计数器算法 2&#xff09;滑动窗口计数器算法 1.1.3、令牌桶算法 1.1.4、漏桶算法 1.2、解决问题 一、Sentinel…

PMP考试刷题记录20240125

1、所有干系人都在开会讨论一个新项目&#xff0c;该项目预计将在一个月内启动&#xff0c;并持续至少10次迭代&#xff0c;其中一个干系人提到应该有人负责开发和维护产品路线图。谁应该承担这个责任? A.项目经理 B.开发团队 C.ScrumMaster D.产品负责人 答案&#xff1…

使用X11VNC远程连接统信UOS

原文链接&#xff1a;使用X11VNC远程连接统信UOS hello&#xff0c;大家好&#xff01;继我们之前介绍了使用xrdp远程连接统信UOS桌面操作系统后&#xff0c;今天我要带大家了解另一种远程连接方法——使用X11VNC。通过在统信UOS上安装X11VNC服务&#xff0c;您可以轻松地实现从…

python pip安装包时,出现 WARNING: Ignoring invalid distributio xxxx,解决办法

pip安装包时&#xff0c;出现 WARNING: Ignoring invalid distributio xxxx&#xff0c;解决办法 遇到的问题&#xff0c;如图 这个问题其实就是python环境下的包无效了&#xff0c;找到WARNING: Ignoring invalid distributio xxxx后面对应的路径&#xff0c;删除对应的~XXXX…

初探二分法

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 文章目录 推荐阅读题目解法一解法二 题目 题目&#xff1a;给定一个 n 个元素有序的&#xff0…

C语言——联合和枚举

目录 一、联合体 1.1 联合体类型的声明 1.2 联合体的特点 1.3 相同成员的结构体和联合体对比 1.4 联合体大小的计算 1.5 联合的⼀个练习 二、枚举类型 2.1 枚举类型的声明 2.2 枚举类型的优点 2.3 枚举类型的使用 一、联合体 1.1 联合体类型的声明 像结构体⼀样…

【AI】深度学习与图像描述生成——看图说话(1)

还记得我闲来无事&#xff0c;用大模型来“洗图”吗&#xff0c;就是想抄袭别人的图&#xff0c;但是又要装作原创的样子。因为洗稿大家都熟悉&#xff0c;洗图其实也是一样的。 【AIGC】今天想用AI“洗个图”&#xff0c;失败了&#xff0c;进来看我怎么做的-CSDN博客 【AIG…

【QT+QGIS跨平台编译】之八:【zstd+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、zstd介绍二、文件下载三、文件分析四、pro文件五、编译实践一、zstd介绍 ZSTD(Zstandard的缩写),是一种快速压缩算法,提供了高压缩比功能。ZSTD还为小数据提供了一种特殊的模式,称为字典压缩。ZSTD库使用BSD许可证作为开放源码软件提供的。它的格式是稳定的,…