jianzhiOffer第二版难重点记录

news2025/7/13 22:03:57


04. 二维数组中的查找icon-default.png?t=N176https://leetcode.cn/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/

思路:可以每层用以恶搞二分查找,优化思路:从左下角出发直接用二分。

​​​​​​07. 重建二叉树icon-default.png?t=N176https://leetcode.cn/problems/zhong-jian-er-cha-shu-lcof/

思路:根据前序遍历和中序遍历来确定最终的树。

19. 正则表达式匹配icon-default.png?t=N176https://leetcode.cn/problems/zheng-ze-biao-da-shi-pi-pei-lcof/

递归或者是动态规划

func isMatch(s string, p string) bool {
    dp := make([][]bool , len(s) + 1)
    for i := 0 ; i <= len(s); i++{
        dp[i] = make([]bool , len(p) + 1)
    }
    dp[0][0] = true
    for i := 1 ; i <= len(p); i++{ // s的长度为0的时候初始化
        if (i % 2) == 0 && p[i-1] == '*'{
            dp[0][i] = dp[0][i-2] 
        }
    }
    for i := 1; i <= len(s); i++{
        for j := 1 ; j <= len(p); j++{
            // 当前值相等的时候
            if p[j - 1] == '.' || p[j-1] == s[i - 1]{
                dp[i][j] = dp[i-1][j-1]
            }
            // 若果为*的时候考虑
            if p[j-1] == '*'{
                dp[i][j] = dp[i][j-2] // 表示当前x*为空
                if p[j-2] == '.' || p[j-2] == s[i-1]{ // 如果x等于当前值的话可以取一个x*,这里表示s[i-1]已经被解决了
                    dp[i][j] = dp[i][j] || dp[i-1][j]
                }
            }
        } 
    }
    return dp[len(s)][len(p)]
}

递归的写法

func isMatch(s string, p string) bool {
    if len(p) == 0 && len(s) == 0{
        return true
    }
    if len(p) == 0{
        return false
    }
    if len(s) == 0{
        if len(p) >= 2 && p[1] == '*'{
            return isMatch(s , p[2:])
        }
        return false
    }
    if len(p) >= 2 && p[1] == '*'{
            if p[0] == '.' || s[0] == p[0]{
                return isMatch(s,p[2:]) || isMatch(s[1:] , p)
            }else{
                return isMatch(s , p[2:])
            }
        
    }else {
        if p[0] == '.' || s[0] == p[0]{
                return isMatch(s[1:] , p[1:])
        }
    }
    return false
}

30. 包含min函数的栈icon-default.png?t=N176https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof/

如何实现一个包含最小值的栈,要能O(1)的时间获取最小值,有两种思路,第一种可以考虑用一个链表去模拟栈,维护一个最小值的变量,第二种方案可以考虑用一个辅助栈去存储最小的值。

type MinStack struct {
    a []int
    b []int
}

/** initialize your data structure here. */
func Constructor() MinStack {
    return MinStack{
        []int{}, []int{math.MaxInt32},
    }
}
func min(i, j int) int {
    if i < j {
        return i
    }
    return j
}
func (this *MinStack) Push(x int) {
    this.a = append(this.a, x)
    this.b = append(this.b, min(x, this.b[len(this.b)-1]))
}

func (this *MinStack) Pop() {
    this.a = this.a[:len(this.a)-1]
    this.b = this.b[:len(this.b)-1]
}

func (this *MinStack) Top() int {
    return this.a[len(this.a)-1]
}

func (this *MinStack) Min() int {
    return this.b[len(this.b)-1]
}

33.二叉搜索树的后序遍历序列icon-default.png?t=N176https://leetcode.cn/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof/

根据后续遍历:左右根,根的左右小于,根的右边大于

func verifyPostorder(postorder []int) bool {
    // 思路 找到右节点
    // 右节点的右边大于右节点的左边
    var recursion func(left , right int)bool
    recursion = func(left , right int)bool{
        if left >= right {
            return true
        }
        index := left 
        for index <= right && postorder[index] < postorder[right]{
            index++
        }
        index --
        for i := index + 1 ; i < right ; i++{
            if postorder[i] < postorder[right]{
                return false
            }
        }
        return recursion(left , index) && recursion(index + 1 , right - 1)
    }
    return recursion(0 , len(postorder)-1)
}

43. 1~n 整数中 1 出现的次数icon-default.png?t=N176https://leetcode.cn/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/

44. 数字序列中某一位的数字icon-default.png?t=N176https://leetcode.cn/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi-lcof/

func findNthDigit(n int) int {
        if n == 0 {
                return 0
        }
        start := 1
        count := 9
        length := 1
        for n > count {
                n -= count
                start *= 10
                length++
                count = 9 * start * length
        }
        index := (n - 1) / length + start
        yu := (n - 1) % length
        return int(strconv.Itoa((index))[yu] - '0')
}
/* 数字范围    数量  位数    占多少位1-9        9      1       910-99      90     2       180100-999    900    3       27001000-9999  9000   4       36000  ...例如 2901 = 9 + 180 + 2700 + 12 即一定是4位数,第12位   n = 12;数据为 = 1000 + (12 - 1)/ 4  = 1000 + 2 = 1002定位1002中的位置 = (n - 1) %  4 = 3    s.charAt(3) = 2;*/

49. 丑数icon-default.png?t=N176https://leetcode.cn/problems/chou-shu-lcof/

堆的应用

51. 数组中的逆序对icon-default.png?t=N176https://leetcode.cn/problems/shu-zu-zhong-de-ni-xu-dui-lcof/

归并方法思路

func reversePairs(nums []int) int {
    res := 0
    tep := make([]int, len(nums))
    var mergeSort func(left, right int)
    merge := func(left, mid, right int) {
        i := left
        j := mid + 1
        index := left
        for i <= mid && j <= right {
            if nums[i] > nums[j] {
                tep[index] = nums[j]
                // fmt.Println("1111")
                res = res + (mid - i + 1)
                j++
            } else {
                tep[index] = nums[i]
                i++
            }
            index++
        }
        for i <= mid {
            tep[index] = nums[i]
            i++
            index++
        }
        for j <= right {
            tep[index] = nums[j]
            j++
            index++
        }
        for i := left; i <= right; i++ {
            nums[i] = tep[i]
        }
    }
    mergeSort = func(left, right int) {
        if left >= right {
            return
        }
        mid := left + (right-left)/2
        mergeSort(left, mid)
        mergeSort(mid+1, right)
        merge(left, mid, right)
    }
    mergeSort(0, len(nums)-1)
    return res
}

56 - I. 数组中数字出现的次数icon-default.png?t=N176https://leetcode.cn/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/

数组中所有数字都出现两次,有两个出现一次的数字,找出来,这个就是利用二进制的原理进行分组,先全部异或,取出两数已获结果,在通过(n&-n)取出第一位置不一样的作为分组标志。

60n个骰子的点数icon-default.png?t=N176https://leetcode.cn/problems/nge-tou-zi-de-dian-shu-lcof/

//浪费空间的写法,但是比较容易理解
func dicesProbability(n int) []float64 {
    dp := make([][]float64, n+1) // dp[i][j] 表示i个骰子,点数和为j的概率
    for i := 1; i <= n; i++ {
        dp[i] = make([]float64, 6*i+1)
    }
    for i := 1; i <= 6; i++ {
        dp[1][i] = float64(1) / 6
    }
    for i := 2; i <= n; i++ {
        for k := i; k <= 6*i; k++ { // 当前的点数
            for t := 1; t <= 6 && k > t; t++ { // 当前出现的点数
                if k-t <= 6*(i-1) { // 上一级合法出现的点数
                    dp[i][k] += dp[i-1][k-t] / 6 // 上一级出现的点数
                }
            }
        }
    }
    return dp[n][n:]
}
func dicesProbability(n int) []float64 {
    dp := make([]float64, 6)
    for i := 0; i < 6; i++ {
        dp[i] = float64(1) / 6
    }
    for i := 1; i < n; i++ {
        tep := make([]float64, 6*(i+1)-i)
        for j := 0; j < len(dp); j++ {
            for t := 0; t < 6; t++ {
                tep[j+t] = tep[j+t] + dp[j]/6
            }
        }
        dp = tep
    }
    return dp
}

62. 圆圈中最后剩下的数字icon-default.png?t=N176https://leetcode.cn/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/

思路:有三种解法,第一通过数组,第二通过链表,第三,递归去做,定义一个递归函数,f(n , k , i)表示有n个数,当删除第k个数,i表示正在删除第i次。

func lastRemaining(n int, m int) int {
    var f func(n , m , i int)int
    f = func (n , m , i int)int{
        if i == 1{
            return (n + m - 1) % n
        }
        return (f(n - 1 , m , i - 1) + m ) % n
    }
    return f(n , m , n)
}

64. 求1+2+…+​​​​​​nicon-default.png?t=N176https://leetcode.cn/problems/qiu-12n-lcof/

思路:不能使用公式、乘除法,for等,等价for得有递归操作。还可以用快速乘来替代普通的乘法。

65. 不用加减乘除做加法icon-default.png?t=N176https://leetcode.cn/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/

思路:传统思路会直接按位进行计算,优化思路的话,可以考虑用递归的思路,a于b之和可以分为无进位之和和有进位之和,无进位是a^b,有进位的和是(a&b)<<1,对结果进行递归处理,当进位为0的时候,直接返回无进位和就行。

func add(a int, b int) int {
    if b == 0 {
        return a
    }
    return add(a ^ b , (a & b ) << 1)
}

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

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

相关文章

Redis 常用数据类型之 zset

目录 一、zset数据结构 二、Redis的zset 三、详细操作 基础操作&#xff08;zadd、zcrad、zcount&#xff09; 排序操作&#xff08;zrange 、zrevrange &#xff09; 根据分数显示元素&#xff08;zrangebyscore&#xff09; 删除操作&#xff08;zrem、zremrangebyran…

DSPE-PEG-TCO;磷脂-聚乙二醇-反式环辛烯科研用化学试剂简介

中文名称 磷脂-聚乙二醇-反式环辛烯 英文名称 DSPE-PEG-TCO 外观&#xff1a;粉末或半固体&#xff0c;取决于分子量。 溶剂&#xff1a;溶于大部分有机溶剂&#xff0c;如&#xff1a;DCM、DMF、DMSO、THF等等。在水中有很好的溶解性 稳定性&#xff1a;冷藏保存&#xff…

安装包UI美化之路-通过nsNiuniuSkin来做Electron程序的打包、发布与升级

nsNiuniuSkin从发布之初&#xff0c;因其简单、简洁、高效&#xff0c;受到了非常多公司的青睐&#xff0c;现在已经越来越多的公司采用我们的这套解决方案来制作安装包了&#xff01; 从一个安装包UI插件&#xff0c;逐步演化成一套集美观、安全、简洁、自动化为一体的完整的…

ModBus RTU与ModBus TCP通信协议详解

1、Modbus简介 Modbus通信协议由Modicon公司&#xff08;现已经为施耐德公司并购&#xff0c;成为其旗下的子品牌&#xff09;于1979年发明的&#xff0c;是全球最早用于工业现场的总线规约。由于其免费公开发行&#xff0c;该协议免费使用&#xff0c;Modbus通信协议采用的是主…

电力电子技术复习笔记

绪论电力电子器件直流-直流直流直流动态模型整流电路逆变电路&#xff1a;有源逆变软开关电路期末绪论 电力电子技术&#xff1a;使用电力电子器件对电能进行转换和控制的技术 电力电子技术和信息电子技术的本质区别&#xff1a; 电力电子技术主要用于电能变换 信息电子技术…

2023什么蓝牙耳机好用不贵?适合学生党的国产蓝牙耳机推荐

蓝牙耳机因为摆脱了线的束缚&#xff0c;在日常生活中解放了双手&#xff0c;使用更便捷。现如今的蓝牙耳机越来越多&#xff0c;每款耳机都有自己的侧重。下面&#xff0c;我来给大家推荐几款好用不贵发国产蓝牙耳机&#xff0c;一起来看看吧。 一、南卡小音舱蓝牙耳机 参考…

Linux操作系统基础知识命令参数详解

Linux操作系统 RAID分组 RAID JBOD RAID JBOD的意思是Just a Bunch Of Disks&#xff0c;是将多块硬盘串联起来组成一个大的存储设备&#xff0c;从某种意义上说这种类型不被算作RAID&#xff0c;在维基百科里JBOD同时也被归入非RAID架构。RAID JBOD将所有的磁盘串联成一个单…

【聚类指标】如何评估聚类算法:外部指标和内部指标、指标详解

【聚类指标】如何评估聚类算法&#xff1a;外部指标和内部指标、指标详解 文章目录【聚类指标】如何评估聚类算法&#xff1a;外部指标和内部指标、指标详解1. 前言2. 外部指标2.1 P&#xff08;Purity&#xff09;2.1.1 例子2.2 NMI&#xff08;Normalized Mutual Information…

PHP基础(1)

PHP基础PHP简介解析器最简单的PHP文件传值与传址输出函数数据类型数据类型比较单双引号的区别字符串及常用函数PHP简介 PHP是最常用的动态web开发语言&#xff0c;用于开发动态网站。常见的动态web开发语言还有: asp aspx.jsp(javaweb)。PHP可以嵌入到html中执行&#xff0c;使…

webpack打包ts代码

webpack整合 通常情况下&#xff0c;实际开发中我们都需要使用构建工具对代码进行打包&#xff1b; TS同样也可以结合构建工具一起使用&#xff0c;下边以webpack为例介绍一下如何结合构建工具使用TS&#xff1b; 步骤如下&#xff1a; (1)初始化项目 进入项目根目录&…

IDE 文档注释使用,模板注释,ide配置templates

文档注释基于javadoc模板 类注释 /*** 暂无介绍** author admin* version 1.0.0* <dt><span class"simpleTagLabel">时间:</span></dt>* <dd>2023/2/24</dd>*/方法注释 /*** 暂无描述** author admin* param args */javadoc相…

PowerShell Install Redis

Redis 前言 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 Redis dowload Redis WindowsdownloadRedi…

字节在职5年,一个测试工程师的坎坷之路

几年前进入到IT行业&#xff0c;现在发现学习软件测试的人越来越多&#xff0c;今天我想根据自己的行业经验给大家提一些建议。 跟其他行业相比&#xff0c;做软件测试的岗位确实算是高薪职业&#xff0c;我们那个时候起步的工资并不高&#xff0c;而看现在很多毕业的学生薪资都…

Scala-面向对象引入(包、类和对象)

包 包对象 导包 类和对象 方法和构造器 包 Scala 包的三大作用&#xff08;和 Java 一样&#xff09;&#xff1a; 区分相同名字的类当类很多时&#xff0c;可以很好的管理类控制访问范围 基本语法 package 包名 Scala 有两种包的管理风格&#xff0c;一种方式和 Java …

Transformer模型

图1图2第一张图transfomer模型图&#xff0c;第二张图是是以各个功能模块的形式来呈现transformer的。 在这里我们来讲transformer的几个关键技术: 1.encoder部分的位置嵌入 2.encoder部分的多头注意力机制 3.残差连接 4.LayerNormalization 5.decoder部分的多头注意力的…

如何使用U-Mail搭建企业邮件服务器?

在当今的信息时代&#xff0c;企业也应该跟上时代的步伐。做好企业信息化建设&#xff0c;对企业事业单位尤为重要。电子邮件作为企业信息化过程中的重要组成部分&#xff0c;在企业内部沟通和外部沟通中发挥着重要作用。目前&#xff0c;有实力的企业已经开始倾向于自己搭建邮…

SpringBoot2 黑马 运维实用 01 工程打包与运行

文章目录打包Windows环境运行Windows端口占用使用的排查指令Linux环境运行Linux常用命令jar包导入linux启动jar打包 使用Maven-项目-生命周期-package或者输入命令 mvn package 打包后是一个 .jar 后缀的压缩包 classes是你写的代码 lib是程序运行所依赖的所有jar包 org是启动…

Jenkins配置项目教程

在上一篇[Jenkins的使用教程](https://blog.csdn.net/weixin_43787492/article/details/129028131?spm1001.2014.3001.5501)中我介绍了如何创建一个项目 Jenkins在创建项目中提供了很多功能供我们选择&#xff0c;这里我将对配置项目做一个较完整的介绍Jenkins配置项目0、所有…

ChatGPT 的工作原理:机器人背后的模型

这篇对支持 ChatGPT 的机器学习模型的温和介绍&#xff0c;将从大型语言模型的介绍开始&#xff0c;深入探讨使 GPT-3 得到训练的革命性自我注意机制&#xff0c;然后深入研究人类反馈的强化学习&#xff0c;使 ChatGPT 与众不同的新技术。 大型语言模型 ChatGPT 是一类被称…

mybatis入门配置

mybatis mybatis是一款持久层框架&#xff0c;用于简化JDBC开发 持久层&#xff1a;负责将数据保存到数据库的那一层代码JavaEE的三层架构&#xff1a;表现层、业务层、持久层、&#xff0c;就相当与mvc设计模式过程中的Controller、service、dao 1.创建一个maven模块&#…