【CodeTop】TOP 100 刷题 11-20

news2024/11/15 17:37:22

文章目录

  • 11. 二叉树的层序遍历
    • 题目描述
    • 代码与解题思路
  • 12. 搜索旋转排序数组
    • 题目描述
    • 代码与解题思路
  • 13. 买卖股票的最佳时机
    • 题目描述
    • 代码和解题思路
  • 14. 岛屿数量
    • 题目描述
    • 代码与解题思路
  • 15. 环形链表
    • 题目描述
    • 代码与解题思路
  • 16. 有效的括号
    • 题目描述
    • 代码与解题思路
  • 17. 合并两个有序数组
    • 题目描述
    • 代码与解题思路
  • 18. 全排列
    • 题目描述
    • 代码与解题思路
  • 19. 二叉树的最近公共祖先
    • 题目描述
    • 代码与解题思路
  • 20. 二叉树的锯齿形层序遍历
    • 题目描述
    • 代码与解题思路

11. 二叉树的层序遍历

题目链接:102. 二叉树的层序遍历

题目描述

代码与解题思路

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func levelOrder(root *TreeNode) (ans [][]int) {
    if root == nil {
        return
    }
    curQueue := []*TreeNode{root}
    for len(curQueue) > 0 {
        nextQueue := curQueue
        curQueue = nil
        tmp := []int{}
        for _, v := range nextQueue {
            tmp = append(tmp, v.Val)
            if v.Left != nil {
                curQueue = append(curQueue, v.Left)
            }
            if v.Right != nil {
                curQueue = append(curQueue, v.Right)
            }
        }
        ans = append(ans, tmp)
    }
    return ans
}

多练习就行,把层序遍历的模板背下来

12. 搜索旋转排序数组

题目链接:33. 搜索旋转排序数组

题目描述

代码与解题思路

func search(nums []int, target int) int {
    left, right := 0, len(nums)-1
    for left <= right {
        mid := left+(right-left)/2
        if nums[mid] == target {
            return mid
        }
        if nums[mid] >= nums[left] { // mid 在左区间
            if target >= nums[left] && target < nums[mid] { // target 在 mid 左边
                right = mid-1 
            } else { // target 在 mid 右边
                left = mid+1
            }
        } else { // mid 在右区间
            if target <= nums[right] && target > nums[mid] { // target 在 mid 右边
                left = mid+1
            } else { // target 在 mid 左边
                right = mid-1
            }
        }
    }
    return -1
}

二分还是得靠多练多思考,这里的情况很多,如果再遇到类似的情况,冷静分析,一点点的用 if else 就行,不用畏手畏脚的。

13. 买卖股票的最佳时机

题目链接:121. 买卖股票的最佳时机

题目描述

代码和解题思路

func maxProfit(prices []int) int {
    minPrice, profit := 10000, 0
    for _, v := range prices {
        minPrice = min(minPrice, v)
        profit = max(profit, v-minPrice)
    }
    return profit
}

核心思路:minPrice 记录历史最低价格,profit 记录往后的每次最高价格卖出赚到的钱,这样遍历完一次就能得到最大的利润了。

14. 岛屿数量

题目链接:200. 岛屿数量

题目描述

代码与解题思路

func numIslands(grid [][]byte) (cnt int) {
    for i := 0; i < len(grid); i++ {
        for j := 0; j < len(grid[0]); j++ {
            if grid[i][j] == '1' {
                dfs(grid, i, j)
                cnt++
            }
        }
    }
    return cnt
}

func dfs(grid [][]byte, i, j int) {
    if i < 0 || j < 0 || i >= len(grid) || j >= len(grid[0]) || grid[i][j] == '0' {
        return
    }
    grid[i][j] = '0'
    dfs(grid, i+1, j)
    dfs(grid, i-1, j)
    dfs(grid, i, j+1)
    dfs(grid, i, j-1)
}

这是一道基础的 dfs 题目,代码的核心点有三个部分:

  1. 遍历整个二维数组进行 dfs
  2. 只搜索:上下左右
  3. 将搜索过的位置置为 ‘0’

其实就是基础的 dfs 需要注意的点,然后注意一下边界条件就行。

15. 环形链表

题目链接:141. 环形链表

题目描述

代码与解题思路

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func hasCycle(head *ListNode) bool {
    if head == nil || head.Next == nil {
        return false
    }
    pre, cur := head, head
    for cur.Next != nil && cur.Next.Next != nil {
        pre = pre.Next
        cur = cur.Next.Next
        if pre == cur {
            return true
        }
    }
    return false
}

这道题目实际上是可以用哈希来做的,我们遍历放进哈希表,当遇到相同节点的时候就证明链表有环了,如果没遇到就证明没有,就用 head != nil 来做结束条件,有尾就结束了,有环就会再进一次哈希。

不过我这段代码用的是更优的方法,用的是追击算法,慢指针一次一步,快指针一次两步,最后一定能够追上。面试的时候可以把上面的思路讲一讲,然后实现下面这种解法。

16. 有效的括号

题目链接:20. 有效的括号

题目描述

代码与解题思路

func isValid(s string) bool {
    hash := map[byte]byte{')':'(', '}':'{', ']':'['}
    stack := []byte{}
    for i := 0; i < len(s); i++ {
        if s[i] == '(' || s[i] == '[' || s[i] == '{' {
            stack = append(stack, s[i])
        } else if len(stack) > 0 && stack[len(stack)-1] == hash[s[i]] {
            stack = stack[:len(stack)-1]
        } else {
            return false
        }
    }
    return len(stack) == 0
}

这道题目最重要的就是分析好可能出现的情况:

第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以 return false;

第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符,所以return false;

第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号 return false;

字符串遍历完之后,栈是空的,就说明全都匹配了。

分析完之后,直接根据需求写代码就行了。

小技巧:通过 map 映射少写几个 if else 语句。

17. 合并两个有序数组

题目链接:88. 合并两个有序数组

题目描述

代码与解题思路

func merge(nums1 []int, m int, nums2 []int, n int)  {
    tmp := []int{}
    i, j := 0, 0
    for m > 0 && n > 0 {
        if nums1[i] < nums2[j] {
            tmp = append(tmp, nums1[i])
            i++
            m--
        } else {
            tmp = append(tmp, nums2[j])
            j++
            n--
        }
    }
    for m > 0 {
        tmp = append(tmp, nums1[i])
        i++
        m--
    }
    for n > 0 {
        tmp = append(tmp, nums2[j])
        j++
        n--
    }
    for i := 0; i < len(nums1); i++ {
        nums1[i] = tmp[i]
    }
}

首先是我的朴素解法,开一个 tmp 数组合并好了,然后再赋值给 nums1 数组,这样空间复杂度是 O(N),但也是最容易想的一种方法

如果想要原地进行合并的话,就需要用到题目给我们准备的 nums[] 数组给出的后面补的 0 的空间,然后从后往前合并(主要得记住从后往前遍历而不会造成覆盖的思想)

func merge(nums1 []int, m int, nums2 []int, n int)  {
    p1, p2, p := m-1, n-1, m+n-1
    for p2 >= 0 { // 从后往前遍历
        if p1 >= 0 && nums1[p1] > nums2[p2] {
            nums1[p] = nums1[p1]
            p1--
        } else {
            nums1[p] = nums2[p2]
            p2--
        }
        p--
    }
}

18. 全排列

题目链接:46. 全排列

题目描述

代码与解题思路

func permute(nums []int) (ans [][]int) {
    n := len(nums)
    path := make([]int, n)
    onPath := make([]bool, n)
    var dfs func(i int)
    dfs = func(i int) {
        if i == n {
            // 这个方式创建了一个新的切片,保证了 path 切片和新切片不共享内存
            ans = append(ans, append([]int(nil), path...))
            return
        }
        for j, on := range onPath { // 每次进入都会枚举所有数,所有情况都会走一遍
            if on == false {
                path[i] = nums[j]
                onPath[j] = true
                dfs(i+1)
                onPath[j] = false
            }
        }
    }
    dfs(0)
    return ans
}

注释很明了了,注意 go 的二维数组追加切片的方式就行,dfs 的模板算法,忘了就多练,多练几次就记住了。

19. 二叉树的最近公共祖先

题目链接:236. 二叉树的最近公共祖先

题目描述

代码与解题思路

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
    // 走到空节点或者找到了, 就返回
    if root == nil || root == p || root == q {
        return root
    }
    // 左右找 p 和 q
    left := lowestCommonAncestor(root.Left, p, q)
    right := lowestCommonAncestor(root.Right, p, q)
    // 如果左右都找不到 p 和 q, 就就返回空
    if left == nil && right == nil {
        return nil
    }
    // 左子树找不到, 就返回右子树找的结果 
    if left == nil {
        return right
    }
    // 右子树找不到, 就返回左子树找的结果
    if right == nil {
        return left
    }
    // 左右子树都找到了 p 或 q, 那 root 就是他们最近的公共祖先
    return root
}

这道题不好想,多刷几遍,把这个思路背下来,然后一直用这一个思路来做题就行,这个思路还是非常的清晰的,刷熟了应该没有问题,注释非常的详细。需要注意的是:前三行代码已经把整个树搜索过一遍了,能走到后面的代码证明 left 和 right 的值已经出来了。

20. 二叉树的锯齿形层序遍历

题目链接:103. 二叉树的锯齿形层序遍历

题目描述

代码与解题思路

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func zigzagLevelOrder(root *TreeNode) (ans [][]int) {
    if root == nil {
        return
    }
    q := []*TreeNode{root}
    n := 0
    for len(q) > 0 {
        nextq := []*TreeNode{}
        tmp := make([]int, len(q))
        for i, v := range q {
            if n%2 == 0 {
                tmp[i] = v.Val
            } else {
                tmp[len(q)-1-i] = v.Val
            }
            if v.Left != nil {
                nextq = append(nextq, v.Left)
            }
            if v.Right != nil {
                nextq = append(nextq, v.Right)
            }
        }
        n++
        q = nextq
        ans = append(ans, tmp)
    }
    return ans
}

依旧是熟悉的配方,熟悉的层序遍历,还是得多刷几遍层序遍历的模板,不然总是记不住,主要就是添加了 n 这个变量来判断要不要反着插入数据,其他的地方就是层序遍历(需要注意的地方:通过创建一个足够大小的数组,然后根据下标来完成正序和倒序的插入,学习一下这个思路)

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

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

相关文章

呼叫中心自建好还是云外呼好用?

传统的呼叫中心在科技的发展下已经被不适用了&#xff0c;都开始使用起智能化的呼叫中心&#xff0c;一个是自建式呼叫中心&#xff0c;一个是云外呼系统。那自建式呼叫中心与云外呼系统的区别有哪些呢&#xff1f; 1、企业自建呼叫中心 劣势 系统维护更新难&#xff1a;自建…

我的创作纪念日2048天

机缘 在这特殊的日子里&#xff0c;我要庆祝我的 CSDN 创作纪念日——已经坚持了整整2048天&#xff01; 在这2048天里&#xff0c;我经历了很多成长和收获。作为一名技术写手&#xff0c;我投入了大量的时间和精力来分享我的知识和经验。我曾经写过关于数据库、数据同步、数…

AI一点通:卷积神经网络的输出节点大小如何计算?全连接层必要输入大小如何设置

在使用卷积网络&#xff08;CNN&#xff09;时&#xff0c;一个步骤是计算经过卷积和池化步骤后的输出大小&#xff0c;以便我们可以将输出连接到一个完全收集的线性层。 以Pytorch中的一维CNN为例&#xff0c; self.conv1 nn.Conv1d(in_channels1, out_channels64, kernel_s…

python数据结构与算法-10_递归

递归 Recursion is a process for solving problems by subdividing a larger problem into smaller cases of the problem itself and then solving the smaller, more trivial parts. 递归是计算机科学里出现非常多的一个概念&#xff0c;有时候用递归解决问题看起来非常简单…

面对网络渠道低价 品牌如何应对

品牌在发展过程中&#xff0c;会不断拓展自己的销售渠道&#xff0c;网站渠道是顺应消费者习惯的一种销售战场&#xff0c;没有品牌会轻易丢弃这个渠道&#xff0c;但是网络渠道的低价又是很常见的&#xff0c;所以只有及时的治理渠道低价&#xff0c;对应的渠道才会发展越来越…

【shell】shell指令学习

仅供本人自学&#xff0c;完全从自己可以理解的角度写的&#xff0c;知识点都是copy网上已有的学习资料&#xff0c;侵权请联系本人删除&#xff0c;谢谢。 1. 文本资料学习 学习Linux&#xff0c;从掌握grep、sed、awk开始吧。 Linux文本三剑客超详细教程—grep、sed、awk …

【AGC】鸿蒙应用软件包上传问题解析

【问题背景】 近期收到了一些反馈&#xff0c;一些鸿蒙元服务开发者在发布应用市场的过程中&#xff0c;上传.app包时遇到了不同的报错&#xff0c;导致上传失败&#xff0c;下面来看一下这些报错的具体原因&#xff0c;如何正确打包上传。 【问题描述1】 HarmonyOS元服务软件…

排序算法--选择排序

实现逻辑 ① 第一轮从下标为 1 到下标为 n-1 的元素中选取最小值&#xff0c;若小于第一个数&#xff0c;则交换 ② 第二轮从下标为 2 到下标为 n-1 的元素中选取最小值&#xff0c;若小于第二个数&#xff0c;则交换 ③ 依次类推下去…… void print_array(int a[], int n){f…

逐字节讲解 Redis 持久化(RDB 和 AOF)的文件格式

前言 相信各位对 Redis 的这两种持久化机制都不陌生&#xff0c;简单来说&#xff0c;RDB 就是对数据的全量备份&#xff0c;AOF 则是增量备份&#xff0c;而从 4.0 版本开始引入了混合方式&#xff0c;以 7.2.3 版本为例&#xff0c;会生成三类文件&#xff1a;RDB、AOF 和记…

这7款神仙软件,程序员必备!

如果你是程序员、开发者、网络运维等 IT 从业者日常工作中大家肯定会用到很多网站&#xff0c;今天给大家带来7款压箱底的神仙软件&#xff0c;希望可以帮助有需要的码农朋友实现更高效地办公。 一、Everything 适用&#xff1a;本地文件搜索神器 就是为了极速检索而生,其实…

随机微分方程数值模拟

http://www.lpma-paris.fr/pageperso//lemaire/projets/Papers/NiVi08.pdf See 知乎https://zhuanlan.zhihu.com/p/28628912

CRM商机管理软件:构建客户为中心的管理理念

企业为什么选择CRM商机管理软件&#xff1f;1.CRM软件能够帮助企业建立以客户为中心的管理理念&#xff1b;2.CRM商机管理软件全面直观的展示客户数据&#xff1b;3.市场人员可以制订个性化的营销策略&#xff1b;4.移动应用为外出的销售带来的便利。 1.构建客户为中心的管理理…

2304. 网格中的最小路径代价 : 从「图论最短路」过渡到「O(1) 空间的原地模拟」

题目描述 这是 LeetCode 上的 「2304. 网格中的最小路径代价」 &#xff0c;难度为 「中等」。 Tag : 「最短路」、「图」、「模拟」、「序列 DP」、「动态规划」 给你一个下标从 0 开始的整数矩阵 grid&#xff0c;矩阵大小为 m x n&#xff0c;由从 0 到 的不同整数组成。 你…

Java线程的学习

本来我以为这可能只是Java里的一小块知识点&#xff0c;但当我搜索自己关注的Up主的网课时&#xff0c;觉得还是开一个系列来记录好了。我的记录绝不仅仅是照搬课程中的内容&#xff0c;我会带上自己的理解以及示例代码、并且是按照本人的专业课老师上课的节奏来记录&#xff0…

maven打包可执行jar含依赖lib

修改pom.xml <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><!-- jdk8可用&#xff0c;其他jdk版本可能需改插件版本 --><version>2.3.7.RE…

迁新址 启新程|美创科技杭州总部乔迁仪式圆满举行

“迁新址 启新程” 2023年11月21日 美创科技杭州总部乔迁仪式隆重举行 杭州未来科技城管委会、余杭国投集团、浙江省网络空间安全协会、浙江鸿程、华睿投资、金艮投资、如山资本、赛伯乐投资、宽带资本、普华投资、国中创投、密码资本、东方富海、之江商学、阿里云、联通&…

AI辅助带货直播场景源码系统 附带网站的搭建教程

互联网技术的发展和普及&#xff0c;直播带货行业迅速崛起。然而&#xff0c;直播带货在带来商机的同时&#xff0c;也面临着诸多挑战。如直播内容缺乏新意、转化率低等问题。针对这些问题&#xff0c;AI辅助带货直播场景源码系统应运而生&#xff0c;旨在利用人工智能技术&…

项目管理PMP6.0-五大过程组、十大知识领域、四十九个过程(记忆码:7664363734)

项目管理PMP6.0-五大过程组、十大知识领域、四十九个过程&#xff08;记忆码&#xff1a;7664363734&#xff09; 项目经理的影响力范围三者关系图&#xff08;五大过程组、十大知识领域、四十九个过程&#xff09;五大过程组十大知识领域十大知识领域之间联系 四十九个过程&am…

C# Onnx 特征匹配 DeDoDe 检测,不描述---描述,不检测

目录 介绍 效果 模型信息 项目 代码 下载 介绍 github地址&#xff1a;https://github.com/Parskatt/DeDoDe DeDoDe &#x1f3b6; Detect, Dont Describe - Describe, Dont Detect, for Local Feature Matching The DeDoDe detector learns to detect 3D consisten…

FSCTF2023-Reverse方向题解WP。学习贴

文章目录 [FSCTF 2023]signin[FSCTF 2023]MINE SWEEPER[FSCTF 2023]Xor[FSCTF 2023]EZRC4[FSCTF 2023]ez_pycxor[FSCTF 2023]Tea_apk[FSCTF 2023]ezcode[FSCTF 2023]ezbroke[FSCTF 2023]rrrrust!!![FSCTF2023]ezrev&#xff08;未解决&#xff09; [FSCTF 2023]signin UPX壳&am…