【CodeTop】TOP 100 刷题 11-20

文章目录

  • 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 := curQueuecurQueue = niltmp := []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)-1for left <= right {mid := left+(right-left)/2if 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, 0for _, 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, headfor cur.Next != nil && cur.Next.Next != nil {pre = pre.Nextcur = cur.Next.Nextif 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, 0for 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-1for 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] = truedfs(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 和 qleft := 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 := 0for 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 = nextqans = append(ans, tmp)}return ans
}

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

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

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

相关文章

使用 millis() 函数作为延迟的替代方法(电位器控制延迟时间)

接线图&#xff1a; 代码&#xff1a; unsigned long currentMillis 0; unsigned long previousMillis_LED1 0; unsigned long LED1_delay0; unsigned long previousMillis_LED2 0; unsigned long LED2_delay0; #define LED1 3 #define LED2 9 #define P1 A2 …

python写文件

output_file open(E:/XD_transfer/代码/CNN_new/try.csv, w) output_file.write(Sample, \n) for j in range(5):output_file.write(str(j) \n)

2023亚太杯数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 最短时…

关于 win11 系统下12代/13代英特尔大小核架构 CPU 的 VMware 优化:输入延迟、卡顿,大小核调度

关于 win11 系统下12代/13代英特尔大小核架构 CPU 的 VMware 优化&#xff1a;输入延迟、卡顿&#xff0c;大小核调度 一、前言二、VMware 的优化2.1 键鼠输入延迟问题的解决2.1.1 搜索内核隔离2.1.2 关闭内存完整性并重启2.1.3 搜索启用或关闭windows功能2.1.4 关闭 hyper-v 和…

【23真题】难!下沙“小清华”难度爆增!

今天分享的是23年“下沙小清华”杭州电子科技大学843的信号与系统试题及解析。 本套试卷难度分析&#xff1a;22年杭电843考研真题&#xff0c;我也发布过&#xff0c;若有需要&#xff0c;戳这里自取&#xff01;平均分为112分&#xff0c;最高分为145分&#xff01;该院校23…

Impala VS Hive

Impala和Hive的关系 Impala是基于Hive的大数据实时分析查询引擎&#xff0c;直接使用Hive的元数据库Metadata,意味着impala元数据都存储在Hive的metastore中。并且impala兼容Hive的sql解析&#xff0c;实现了Hive的SQL语义的子集&#xff0c;功能还在不断的完善中。 与Hive的…

如何用CHAT理解数理化?

问CHAT&#xff1a;扇形面积的概念&#xff0c;简单阐述一下。 CHAT回复&#xff1a; 扇形面积是指扇形这种二维几何图形所覆盖的区域大小。 扇形是一个圆的一部分&#xff0c;是由圆心出发的两条射线&#xff08;半径&#xff09;和这两条射线所夹角决定的圆周上的弧线所围成…

近期为何事故频发,企业安全生产如何保障?

近期&#xff0c;多地陆续发生了一系列企业安全生产事故&#xff0c;给企业和员工带来了严重的生命和财产损失&#xff0c;引发了社会各界对安全生产问题的广泛关注。安全生产是企业发展的重要保障&#xff0c;然而&#xff0c;企业在追求经济效益的过程中&#xff0c;往往忽视…

为虚幻引擎开发者准备的Unity指南

目录 1.前言2.编辑器2.1 Scene 视图&#xff08;视口&#xff09;2.2 Game 视图 (Play in Editor)2.3.Hierarchy 窗口 (World Outliner)2.4 Project 窗口(Content Browser)2.5 Inspector (Details)2.6 Console&#xff08;消息视图/输出日志&#xff09;2.7 Modes 面板在哪里&a…

​​​​​​​3分钟实现EG网关串口连接麦格米特PLC

EG网关串口连接麦格米特PLC 前言&#xff1a;麦格米特PLC广泛应于工业控制领域&#xff0c;是一款性能高、稳定性强的PLC设备。此文档将介绍如何使用EG系列网关通过串口连接麦格米特PLC&#xff0c;并添加到EMCP物联网云平台&#xff0c;实现电脑Web页面、手机APP和微信对麦格米…

【Rxjava详解】(一)观察者模式的拓展

文章目录 RxJava引入扩展的观察者模式RxJava的观察者模式基本实现 RxJava入门示例Action RxJava引入 在介绍RxJava之前先说一下Rx。全称是Reactive Extensions&#xff0c;直译过来就是响应式扩展 Rx基于观察者模式&#xff0c;它是一种编程模型&#xff0c;目标是提供一致的…

怎么判断list是否为null

List<Entity> baseMess new ArrayList<>(); baseMess motiveService.getBaseMessage(machine.get(i),preDate,nowDate); System.out.println("获取Size"baseMess.size()); baseMess.removeIf(Objects::isNull); System.out.println("获取Size"…

Cannot read property ‘pickAlgorithm‘ of null

Cannot read property pickAlgorithm of null 报错显示 node 和 npm的版本号不对应 查看版本号 node -v npm -v node的版本对应 Previous Releases | Node.js (nodejs.org) 我们需要改成对应的mpm版本号 npm install npm6.14.12 -g nodejs与npm版本对应关系以及使用nvm管理n…

『亚马逊云科技产品测评』活动征文|利用EC2云服务器快速部署一个SpringBoot项目

&#xff08;授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道&#xff09; 1. 前言 本文主要是对亚马逊云科技的EC2进行体…

Java基于B/S架构,包括PC后台管理端、APP移动端、可视化数据大屏的智慧工地源码

智慧工地管理平台充分运用数字化技术&#xff0c;聚焦施工现场岗位一线&#xff0c;依托物联网、互联网、AI等技术&#xff0c;围绕施工现场管理的人、机、料、法、环五大维度&#xff0c;以及施工过程管理的进度、质量、安全三大体系为基础应用&#xff0c;实现全面高效的工程…

MySQL之BETWEEN AND包含范围查询总结

一、时间范围 查询参数格式与数据库类型相对应时&#xff0c;between and包含头尾&#xff0c;否则依情况 当数据库字段中存储的是yyyy-MM-dd格式&#xff0c;即date类型&#xff1a; 用between and查询&#xff0c; 参数yyyy-MM-dd格式时&#xff0c;包含头尾&#xff0c;相当…

HTML+CSS+ElementUI搭建个人博客静态页面展示(纯前端)

网站演示 搭建过程 技术选取:HTML/CSS VUE2 ElementUI(Version - 2.15.14)编程软件:VSCode 环境配置与搭建 安装指令 1. 先确保你的电脑已经安装好了npm和node npm -vnode -v2. ElementUI下载&#xff0c;推荐使用 npm 的方式安装 npm i element-ui -S3. CDN引入 <!--…

C语言入门——第十七课

一、二分查询 1.概念 二分查询又被称为二分查找&#xff0c;是一种在有序数组或序列中快速查找到对应元素的一种方法。每次查找范围缩小至原来的一半。 ①前提条件 数组和列表必须有序&#xff0c;否则无法进行二分查找。 ②初始化 确定查找数组和列表的左边界&#xff0…

C盘变红怎么办?一个快速解决C盘快满的方法

前情提要 通常解决C盘快满的方法是&#xff1a; 找到C盘—右击选择“属性”—选择“详细信息”—卸载不常用的软件或者清除临时文件 缺点&#xff1a;成效甚微 今日重点 1.背景知识&#xff1a;微信是我们日常工作和生活都离不开的工具&#xff0c;我们每天使用微信会产生大量…