hot100

哈希

1.两数之和:求数组中两数的和为target,返回下标。用hash,key存数,value存下标,一次遍历,每次判断hash[taget-num]是否存在,存在就返回两个下标。
https://blog.csdn.net/midi666/article/details/127170342

func twoSum(nums []int, target int) []int {res := make(map[int]int)for index,value := range nums {if preIndex, ok := res[target - value]; ok {return []int{preIndex, index}} else {res[value] = index}}return []int{}
}

49.字母异位词分组:给定一个数组,数组中每个元素是字符串如abc,然后按照abc、acb为异位词的原则放到一个数组中,结果是个二维数组。用hash,设置一个map[[26]int][]string,每遍历到一个字符串,再遍历他的每个字符,根据数组中每个字符出现的次数的数组来当作map的key。
https://blog.csdn.net/midi666/article/details/140032365

func groupAnagrams(strs []string) [][]string {tmpMap := make(map[[26]int][]string)for _, str := range strs {tmp := [26]int{}for _, c := range str {tmp[c-'a']++}tmpMap[tmp] = append(tmpMap[tmp], str)}ans := [][]string{}for _, v := range tmpMap {ans = append(ans, v)}return ans
}

128.最长连续序列:注意不是子序列,相当于要原数组排序后的子数组,求长度。先构造哈希表map[int]bool类型,然后遍历哈希表,如果map的[k-1]不存在,则意味着这是一个新的开始,再二层for循环判断k+1在不在,在就遍历并计数(长度++且k++),比较后取最大值。
https://blog.csdn.net/midi666/article/details/127170342

func longestConsecutive(nums []int) int {tmpMap := make(map[int]bool)for _, v := range nums {tmpMap[v] = true}ans := 0for key, _ := range tmpMap {if tmpMap[key-1] == false {long := 1for tmpMap[key+1] {long++key++}ans = max(ans, long)}}return ans
}
双指针

283.移动零:将所有的0移动到最后面。双指针,left和right都初始化为0,right小于N的循环中,只要nums[right] != 0, left和right交换,left++;然后不管怎样都right++,这样0都跑到最后去了。双指针的含义就如下:左边的指针是非0数组部分最右边的边界,右边的指针是为0数组最左边的边界,注意是不为0则进行交换。(好神奇的思路,不好理解,背吧)
https://blog.csdn.net/midi666/article/details/139945762

func moveZeroes(nums []int) {n := len(nums)left := 0right := 0for right < n {if nums[right] != 0 {nums[left], nums[right] = nums[right], nums[left]left++}right++}
}

11.盛水最多的容器:用线围成的边,求最大面积。双指针,从两边开始,每次取较短的那个边乘以宽度,然后比较更新最大面积,然后移动短的边界。
https://blog.csdn.net/midi666/article/details/133173678

func maxArea(height []int) int {left := 0right := len(height) - 1res := 0for left < right {tmp := (right - left) * min(height[left], height[right])res = max(res, tmp)if height[left] < height[right] {left++} else {right--}}return res
}

15.三数之和:返回所有满足三数相加等于0的元素,搞成一个二维数组。先排序然后遍历i,在一些剪枝(包括去除i维度的重复元素)的操作后,用双指针进行处理,注意在匹配到合适的数据后,还需要处理这部分的重复元素
四题汇总

func threeSum(nums []int) [][]int {res := [][]int{}n := len(nums)if n < 3 {return res}sort.Ints(nums)for i := 0; i < n-2; i++ {// 几个异常条件// 第一个就大于0,已经排序了,后面的都会大于0if nums[i] > 0 {break}// 去重,题目中要求了不能有重复的组合if i > 0 && nums[i] == nums[i-1] {continue}// 前三个加起来大于0了,后面的也会大于0if nums[i]+nums[i+1]+nums[i+2] > 0 {break}// 第一个数和最后的俩数加起来还小于0,直接结束这次的循环,让第一个数加点,可能还有救if nums[i]+nums[n-1]+nums[n-2] < 0 {continue}// 前面的都可以后,在这里采用左右双指针j := i + 1k := n - 1for j < k {sum := nums[i] + nums[j] + nums[k]if sum > 0 {k--} else if sum < 0 {j++} else {// 符合预期,先追加进结果res = append(res, []int{nums[i], nums[j], nums[k]})// 再分别对jk去重j++for j < k && nums[j] == nums[j-1] {j++}k--for j < k && nums[k] == nums[k+1] {k--}}}}return res
}

42.接雨水:用木板算范围,求最大面积。第一种先开辟俩数组,分别代表每个位置的前缀最大值和后缀,再遍历一遍,较小的那个减去木桶高度;第二种是双指针,left和right是遍历,pre和suf变量是前后缀最大值,用较小的那个减去木桶高度。注意这道题是前缀最大值,而不是前缀和最大值
https://blog.csdn.net/midi666/article/details/133675415

func trap(height []int) int {n := len(height)ans := 0left := 0right := n-1preMax := 0sufMax := 0for left <= right {preMax = max(preMax, height[left])sufMax = max(sufMax, height[right])if preMax < sufMax {ans += preMax - height[left]left++} else {ans += sufMax - height[right]right--}}return ans
}
滑动窗口

3.无重复字符的最长子串:求长度。滑动窗口+双指针,双指针求长度,定义一个固定大小的数组26[bool]当作固定大小的滑动窗口,遍历字符串,然后每次判断之前有数在数组中时,先将就窗口的left指针对应的数在窗口中改成false,然后left++来缩小左边界直到符合条件为止,然后用ans更新最大长度right-left+1
https://blog.csdn.net/midi666/article/details/138990452

func find(s string) int {window := [26]bool{}left := 0ans := 0for right, c := range s {for window[c-'a'] {window[s[left]-'a'] = falseleft++}window[c-'a'] = trueans = max(ans, right-left+1)}return ans
}

438.找到字符串中所有字母的异位词:s长,p短,返回这些子串的起始索引。用两个数组[26]int,来分别存两个字符串的滑动窗口,存的是字符出现的次数,先初始化p长度的,然后就比较一下;再从头开始遍历s,p窗口就永远不变了,s一进来先左边界–,再右边界++,看看是不是和p相等(数组维度相等)
https://blog.csdn.net/midi666/article/details/139282460

func findAnagrams1(s, p string) (ans []int) {sLen := len(s)pLen := len(p)if sLen < pLen {return}var sWindow, pWindow [26]intfor i, c := range p { // 先把p长度的数据都存进各自的滑动窗口中sWindow[s[i]-'a']++pWindow[c-'a']++}if sWindow == pWindow { // 前置位置的判断,只需要这一次判断ans = append(ans, 0)}// 在这之后pWindow只是用来比较的,没有更新的场景了for i, c := range s[:sLen-pLen] { // 从s字符串的首位开始遍历(这里减去P长度的意思是,每个窗口的大小是pLen,不减的话最后一位就越界了)// 在这里的移动窗口,不是根据left、right来处理的,而是将当前窗口的第一个字符在数组中的位置减1sWindow[c-'a']--         // 将窗口内对应字符的值-1sWindow[s[i+pLen]-'a']++ // 将最后一个字符的下一个字符加1(相当于窗口整体滑动了一位)if sWindow == pWindow {ans = append(ans, i+1) // 如果滑动后的新窗口满足条件,将起始下标返回,此时在这个的循环中,因为已经滑动了,起始下标就是i+1}}return
}
前缀和

560.和为k的子数组:给一个数组和K,求数组中和为K的子数组个数。使用前缀和+hash的思想,单独的前缀和会超时,前缀和的思路就是用一个数组来存每个位置之前的前缀和,注意一般是pre[i+1] = pre[i]+nums[i],然后默认pre[0]=0(看题目灵活变化,也可能是pre[i] = pre[i-1] + nums[i-1]),本题中用一个变量记也可以;然后就是用hash存前缀和出现的次数,如果hash[pre-k]存在,则代表有这么多个子数组和为k。最好的办法是一次遍历,用一个变量来代表前缀和,且代码很短,注意初始化map的时候要初始{0,1},因为在遍历的时候是从s[1]开始计算,相当于s[0] = 0。这道题二次遍历和一次遍历的方法都可以记下(直接背代码把)
另外注意前缀和一般都是下面的模板
https://blog.csdn.net/midi666/article/details/131565463

func subarraySum(nums []int, k int) (ans int) {s := 0 // 相当于s是前缀和cnt := map[int]int{0: 1} // s[0]=0 单独统计for _, x := range nums {s += xans += cnt[s-k] // 这里的含义是s[i] - s[j] = k 代表有一段和为kcnt[s]++}return
}
栈和单调栈

239.滑动窗口最大值:给个数组,给个K,求长度为k的窗口滑动,每次滑动的最大值取出来,成数组返回。这题叫滑动窗口,用的方法却是单调栈(递减),遍历数组,先看queue数组的队尾是否小于num,否的话删队尾,直到可以入队列(入下标)。然后判断长度是不是超了,超了就出对头。然后就是每次循环只要i>=k-1就将队首加进结果数组。
https://blog.csdn.net/midi666/article/details/127185344

func maxSlidingWindow(nums []int, k int) []int {var ans []intvar queue []intfor i, num := range nums {// 1.入队列(元素入队尾,同时要满足队列的单调性)for len(queue) > 0 && nums[queue[len(queue)-1]] <= num {queue = queue[:len(queue)-1]}queue = append(queue, i) // 入的是下标// 2.出队列(元素离开队首),出队列的条件是此时的下标比减去窗口起始位置的下标,大于Kif i-queue[0] >= k {queue = queue[1:]}// 3.记录答案if i >= k-1 { // 这一步主要是用于拦截最开始长度不够K的时候,比如K=3,i是下标要大于等于2的时候,才够第一个窗口// 由于队首到队尾是单调递减,所以窗口最大值就是队首ans = append(ans, nums[queue[0]])}}return ans
}

53.最大子数组和:顾名思义。动态规划或贪心,相对简单,用变量存就行,不必要非得dp数组,先判断下之前的和加上此时的数,和单独此时数的比较,然后在维护一个最大值就行
https://blog.csdn.net/midi666/article/details/122774531

func maxSubArray(nums []int) int {n := len(nums)preMax := nums[0]res := nums[0]for i := 1; i < n; i++ {preMax = max(preMax+nums[i], nums[i])res = max(preMax, res)}return res
}

56.合并区间:给个二维数组,输出合并区间后的二维数组。先排序,一维数组的左端点排序,完事后遍历,要是已处理的右端点大于未处理的左端点,就可能可以合并,取两个的右端点较大的那个。注意排序用slices.SortFunc
https://blog.csdn.net/midi666/article/details/139760334

func merge(intervals [][]int) (ans [][]int) {slices.SortFunc(intervals, func(p, q []int) int {return p[0] - q[0]})for _, p := range intervals {// 遍历到的每一个数组m := len(ans)if m > 0 && p[0] <= ans[m-1][1] { // 遍历到的左端点小于已经遍历过的右端点,可以合并ans[m-1][1] = max(ans[m-1][1], p[1]) // 比如[[1,4], [2,3]]其实就不需要变化} else {ans = append(ans, p)}}return
}

189.轮转数组:给个nums,给个K,1234567在k=3时变成5671234。反转三次,整体一次,左边一次,右边一次
https://blog.csdn.net/midi666/article/details/139815796

func rotate(nums []int, k int) {k = k % len(nums)// slices.Reverse(nums)// slices.Reverse(nums[:k])// slices.Reverse(nums[k:])reverse(nums)reverse(nums[:k])reverse(nums[k:])
}func reverse(nums []int) {left := 0right := len(nums) - 1for left < right {nums[left], nums[right] = nums[right], nums[left]left++right--}
}

238.除自身以外数组的乘积:给定nums,返回新数组。前缀和(这个叫前缀积吧),从头到尾遍历一次,从尾到头遍历一次,每个位置的前缀积是这个位置之前的数的乘机,不要写错了,然后就是再遍历一遍,前后缀相乘
https://blog.csdn.net/midi666/article/details/139816050

func productExceptSelf(nums []int) []int {n := len(nums)pre := make([]int, n)pre[0] = 1for i := 1; i < n; i++ {pre[i] = pre[i-1] * nums[i-1]}suf := make([]int, n)suf[n-1] = 1for i := n - 2; i >= 0; i-- {suf[i] = suf[i+1] * nums[i+1]}ans := make([]int, n)for i := 0; i < n; i++ {ans[i] = pre[i] * suf[i]}return ans
}

41.缺失的第一个正整数:给一个数组,返回一个数,如果没有的话,就返回数组的下一个元素。考虑原地哈希的办法,具体思路是,在经过一系列的调整后,使得每个位置存对应这个位置的数,即nums[i] == i+1, 在i=0的时候代表第一个位置存1,若不相等,则返回i+1;为了满足这个条件,需要做的就是判断nums[i] != nums[nums[i]-1]时且0<nums[i]<n,交换(注意是for循环交换,直到满足才i++)(不好记,背把)
https://blog.csdn.net/midi666/article/details/140136149

func firstMissingPositive(nums []int) int {n := len(nums)for i := 0; i < n; i++ {for nums[i] > 0 && nums[i] < n && nums[i] != nums[nums[i]-1] {nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]}}for i := 0; i < n; i++ {// 如果当前元素不等于它的索引+1,那索引+1就是第一个缺失的正整数if nums[i] != i+1 {return i + 1}}// 没有的话,缺失的正整数就是数组长度+1return n + 1
}

73.矩阵置零:给定二维数组,返回原数组。开两个bool类型的row和col数组,遍历原数组,只要一个元素为0,两个数组的这一行(列)都为0。重新遍历原数组,只要有对应的行列为0,遍历到的这个元素就为0
https://blog.csdn.net/midi666/article/details/139668417

func setZeroes(matrix [][]int) {row := make([]bool, len(matrix))col := make([]bool, len(matrix[0]))for i, r := range matrix {for j, v := range r {if v == 0 {row[i] = truecol[j] = true}}}for i, r := range matrix {for j := range r {if row[i] || col[j] {r[j] = 0}}}
}

54.螺旋矩阵:给定二维矩阵m*n,输出一维矩阵,要顺时针输出。
三题合一

func spiralOrder(matrix [][]int) []int {rows := len(matrix)columns := len(matrix[0])top, bottom := 0, rows -1left, right := 0, columns -1 res := make([]int, 0)nums := rows*columnsfor nums >= 1 {for i := left; i <= right && nums >= 1; i++ {res = append(res, matrix[top][i])nums--}top++for i := top; i <= bottom && nums >= 1; i++ {res = append(res, matrix[i][right])nums--}right--for i := right; i >= left && nums >= 1; i-- {res = append(res, matrix[bottom][i])nums--}bottom--for i := bottom; i >= top && nums >= 1; i-- {res = append(res, matrix[i][left])nums--}left++}return res
}

48.旋转图像:给定二维数组,顺时针旋转90度。先主对角线反转,再水平反转
三题和一

func rotate(matrix [][]int)  {//图片一般都是n*n的n := len(matrix)//水平翻转for i := 0; i < n/2; i++ {matrix[i], matrix[n-1-i] = matrix[n-1-i], matrix[i]}//主对角线翻转for i := 0; i < n; i++ {for j := 0; j < i; j++ {matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]}}
}

74.搜索二维矩阵I:每行递增,每列递增,且下一列的开头元素还大于上一列的结尾,判断target是否存在。这道题用上面的解法也能实现,但实际上是用二分法,left := 0, right := m*n, 然后算出来mid,x := matrix[mid/n][mid%n],再比较大小。n其实是一维矩阵中元素的个数,除以n就是第几行,取余n就是第几列
https://blog.csdn.net/midi666/article/details/139376973

func searchMatrix(matrix [][]int, target int) bool {m := len(matrix)n := len(matrix[0])left := 0right := m * nfor left < right {mid := left + (right-left)/2x := matrix[mid/n][mid%n]if x == target {return true} else if x < target {left = mid + 1} else {right = mid}}return false
}

240.搜索二维矩阵II:每行递增,每列递增,给target,判断是否存在。从右上角开始,若右上角小于target,则排除整行;小于则排除整列。
https://blog.csdn.net/midi666/article/details/139668235

func searchMatrix(matrix [][]int, target int) bool {m := len(matrix)n := len(matrix[0])i, j := 0, n-1           // 从右上角开始for i <= m-1 && j >= 0 { // 还有剩余元素if matrix[i][j] == target {return true}if matrix[i][j] < target {i++} else {j--}}return false
}

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

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

相关文章

WSGI 服务器教程:`full_dispatch_request` 方法解析

Python WSGI 服务器教程&#xff1a;full_dispatch_request 方法解析 在本文中&#xff0c;我们将详细解析一个用于 WSGI 服务器的 full_dispatch_request 方法。这个方法负责处理完整的请求调度&#xff0c;包括请求的前后处理、异常捕获和错误处理。我们将逐行解释该方法的工…

CSS【详解】文本相关样式(含 font 系列样式,文本颜色 color,三种颜色表示法,文本排版-含最佳实战范例,文本装饰,分散对齐,渐变色文本等)

文本风格 font-style font-style:italic 值描述normal默认值。浏览器显示一个标准的字体样式。italic加载对应字体的斜体字体文件&#xff0c;若找不到斜体字体文件&#xff0c;则进行物理上的倾斜。 标签默认font-style:italicoblique浏览器会显示一个倾斜的字体样式。 文本粗…

qt 一个继承object且使用Q_OBJECT宏的类有什么要求

一个继承自QObject且使用Q_OBJECT宏的类在Qt中有以下要求&#xff1a; 继承自QObject&#xff1a; 该类必须直接或间接继承自QObject类。这是使用Qt的信号槽机制、国际化机制以及Qt提供的不基于C RTTI的反射能力的基础。使用Q_OBJECT宏&#xff1a; 在类的定义中&#xff0c;必…

计算机网络——网络层(IP地址与MAC地址、地址解析协议ARP、IP数据报格式以及转发分组、ICMP、IPV6)

IP地址与MAC地址 由于MAC地址已固化在网卡上的ROM 中&#xff0c;因此常常将 MAC地址称为硬件地址或物理地址&#xff1b;物理地址的反义词就是虚拟地址、软件地址或逻辑地址&#xff0c;IP地址就属于这类地址。 从层次的角度看&#xff0c;MAC地址是数据链路层使用的地址&…

内存对齐的定义以及它的重要性

内存对齐是指数据在内存中存储时&#xff0c;按照一定的规则让数据排列在规定的地址上&#xff0c;以提高数据访问的效率和速度。具体来说&#xff0c;内存对齐是计算机体系结构、操作系统和编译器设计等多个层面共同要求的一种数据存储方式。以下是对内存对齐的详细解释以及它…

Java 面试相关问题(上)——基础问题集合问题

这里只会写Java相关的问题&#xff0c;包括Java基础问题、JVM问题、线程问题等。全文所使用图片&#xff0c;部分是自己画的&#xff0c;部分是自己百度的。如果发现雷同图片&#xff0c;联系作者&#xff0c;侵权立删。 1. Java基础面试问题1.1 基本概念相关问题1.1.1 Java语言…

配置Maven并使用IDEA新建一个简单的Springboot项目

一.maven的配置 1.查看电脑上是否配置了maven ①使用快捷键“WinR”打开运行窗口&#xff0c;在窗口中输入cmd&#xff0c;点击确定进入黑色命令窗口 ②在命令行窗口中输入如下命令 mvn -version 如果出现下面的提示则表示该电脑已配置maven&#xff0c;否则需要进行maven配…

systemverilog对象的复制和拷贝

在 SystemVerilog 中&#xff0c;对象的复制分为浅复制&#xff08;shallow copy&#xff09;和深复制&#xff08;deep copy&#xff09;。 浅复制会将原始对象中的所有属性拷贝到新对象中&#xff0c;包括整数、字符串、句柄等。但是&#xff0c;对于句柄属性&#xff0c;浅复…

汇编程序调用 C 程序详解

文章目录 1. ATPCS 规则 2. 汇编和C程序传递参数 汇编程序向 C 程序的函数传递参数 C 程序返回结果给汇编程序 代码示例 3. C 函数使用栈 4. C 语言中读写寄存器 在嵌入式开发中&#xff0c;经常需要在 C 程序和 ARM 汇编程序之间进行相互调用。为了保证这些调用的正确性…

SpringBoot整合Java Mail实现发送邮件

SpringBoot整合Java Mail实现发送邮件 实现 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>发送邮件配置 这里使用qq邮箱发送邮件&#xff0c;需要…

Leetcode3200. 三角形的最大高度

Every day a Leetcode 题目来源&#xff1a;3200. 三角形的最大高度 解法1&#xff1a;模拟 枚举第一行是红色还是蓝色&#xff0c;再按题意模拟即可。 代码&#xff1a; /** lc appleetcode.cn id3200 langcpp** [3200] 三角形的最大高度*/// lc codestart class Solutio…

java.sql.SQLException: Before start of result set

情况描述&#xff0c;在通过JDBC连接数据库时&#xff0c;想直接判断获取的值是否存在&#xff0c;运行时报错。 翻译&#xff1a; 在开始结果集之前 报错截图 解决问题的方法&#xff1a;对结果集ResultSet进行操作之前&#xff0c;一定要先用ResultSet.next()将指针移动至…

RAG 效果提升的最后一步—— 微调LLM

如果说&#xff0c;rerank能够让RAG的效果实现百尺竿头更进一步&#xff0c;那么LLM微调应该是RAG效果提升的最后一步。 把召回的数据&#xff0c;经过粗排&#xff0c;重排序后&#xff0c;送给模型&#xff0c;由模型最后总结答案。LLM的确已经是RAG的最后一步了。 这里还是会…

C#可空类型与数组

文章目录 可空类型NULL合并运算符&#xff08;??&#xff09;数组数组声明数组初始化数组赋值数组访问多维数组交错数组数组类数组类的常用属性数组类的常用方法 可空类型 C#提供了一种特殊的数据类型&#xff0c;nullable类型&#xff08;可空类型&#xff09;&#xff0c;可…

<数据集>夜间车辆识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;5000张 标注数量(xml文件个数)&#xff1a;5000 标注数量(txt文件个数)&#xff1a;5000 标注类别数&#xff1a;8 标注类别名称&#xff1a;[car, pedestrian, traffic light, traffic sign, bicycle, bus, truck…

vue学习day08-v-model详解、sync修饰符、ref和$refs获取dom组件、Vue异步更新和$nextTick

25、v-model详解 &#xff08;1&#xff09;v-model原理 1&#xff09;原理: v-model本质上是一个语法糖&#xff0c;比如&#xff1a;在应用于输入框时&#xff0c;就是value属性与input事件的合写。 2&#xff09;作用 ①数据变&#xff0c;视图变 ②视图变&#xff0c…

wordpress制作主题步骤

WordPress主题的制作是一个涉及多个步骤的过程&#xff0c;旨在控制网站的外观、布局和功能。以下是一个详细的WordPress主题制作指南&#xff1a; 一、准备工作 安装WordPress&#xff1a;首先&#xff0c;确保你已经在你的服务器上安装了WordPress。WordPress可以从其官方网…

短链接服务Octopus-搭建实战

[WARNING] The POM for cn.throwx:octopus-contract:jar:1.0-SNAPSHOT is missing, no dependency information available 解决方案&#xff1a; cd octopus-contract/ mvn install -------------- ➜ octopus-server git:(master) ✗ mkdir -p /data/log-center/octopus/s…

DockerCompose介绍,安装,使用

DockerCompose 1、Compose介绍 将单机服务-通过Dockerfile 构建为镜像 -docker run 成为一个服务 user 8080 net 7000 pay 8181 admin 5000 监控 .... docker run 单机版、一个个容器启动和停止问题&#xff1a; 前面我们使用Docker的时候&#xff0c;定义 Dockerfil…

Lottery 分布式抽奖(个人向记录总结)

1.搭建&#xff08;DDDRPC&#xff09;架构 DDD——微服务架构&#xff08;微服务是对系统拆分的方式&#xff09; &#xff08;Domain-Driven Design 领域驱动设计&#xff09; DDD与MVC同属微服务架构 是由Eric Evans最先提出&#xff0c;目的是对软件所涉及到的领域进行建…