LeetCode Hot 100,快速学习,不断更

        工作做多了有时候需要回归本心,认真刷题记忆一下算法。那就用我这练习时长两年半的代码农民工来尝试着快速解析LeetCode 100吧

快速解析

哈希

 1. 两数之和 - 力扣(LeetCode)

这题很简单啊,思路也很多

1. 暴力搜索,复杂度 N^2

2. 排序后双指针 复杂度 NlogN

3. 用Hash表,已经遍历过的放入Hash表内记录,看看跟未遍历的求和是不是等于目标,复杂度N

func twoSum(nums []int, target int) []int {hashTable := map[int]int{}for i, x := range nums {if p, ok := hashTable[target-x]; ok {return []int{p, i}}hashTable[x] = i}return nil
}

49. 字母异位词分组 - 力扣(LeetCode)

异位词,比如 "abc"和"cba",或者 "acb",反正出现过同样次数的都算是异位词,那么就得想办法,设置一个hash映射,让他们得到的值相等。

1. 先对这个按顺序排序,再拼接起来作为key

2. 整一个26长度数组,统计每个英文字母出现的次数。整个数组作为key用来记录。

128. 最长连续序列 - 力扣(LeetCode)

用哈希直接记录一下整个数组,这样可以去重,还可以以O1的代价来访问值是否存在

然后比如对于值val,如果val-1也在哈希表里,就不计算了(剪枝,降低复杂度)。如果val - 1 不再哈希表里,那么证明val是起点,不断记录val + 1,看看最长能够到多少

func longestConsecutive(nums []int) int {if len(nums) == 0{return 0}cnt := map[int]bool{}for _, v := range nums{cnt[v] = true   }ans := 1for k := range cnt{if cnt[k - 1]{continue}next := k + 1for cnt[next]{next ++ans = max(ans, next - k)}}return ans
}

双指针

283. 移动零 - 力扣(LeetCode)

这题我觉得不应该是easy,高低得是个Middle,我们可以使用双指针,一个指针用来按顺序,另一个用来遍历非零的元素,如果遍历到非零元素,就和第一个指针互换位置。相当于就是把非零的元素全部按顺序填上,那么剩下的就都是0了,因为0会一直被置换到后面,一直往后推。

func moveZeroes(nums []int)  {for i, j := 0, 0; i < len(nums); i++{if nums[i] != 0{nums[i], nums[j] = nums[j], nums[i]j++}}    
}

11. 盛最多水的容器 - 力扣(LeetCode)

传统的双指针,面积是宽度×高度,宽度可以直接用减法,高度就是两边柱子里面最低的。

那么怎么双指针呢,一左一右。那怎么移动指针呢?那就得尝试往更高地方向走,我们先从最矮的一遍移动,每次求max面积,这样就可以求出最多水的容器了。

func maxArea(height []int) int {ans := 0for i, j := 0, len(height) - 1; i < j; {area := (j - i) * min(height[i], height[j])ans = max(area, ans)if height[i] < height[j]{i ++}else{j --}}    return ans
}

15. 三数之和 - 力扣(LeetCode)

正常情况之下,我们是不是想要用3个for,这样就是N^3。一般这时候就会想着省时间了,排序,或者二分。因为这里是找3个数,所以先要排序,排序完后就是一个有顺序的数组。

我们用一层循环来遍历第一个数,剩下的复杂度实际上就是两数之和的复杂度了。

这个两数之和,我们可以用双指针,不断地往中间夹缩小范围。这样时间复杂度就小于On了。

func threeSum(nums []int) (ans [][]int) {sort.Ints(nums)n := len(nums)for i := 0; i < n - 2; i ++{if i > 0 && nums[i] == nums[i-1]{continue}j, k := i + 1, n - 1 target := -nums[i]for j < k{        sum := nums[j] + nums[k]if  sum == target{ans = append(ans, []int{nums[i], nums[j], nums[k]})for j < k && nums[j] == nums[j+1]{j++}for j < k && nums[k] == nums[k-1]{k--}j++k--}else if sum < target{j++}else{k--}}}return
}

42. 接雨水 - 力扣(LeetCode)

这题是比较简单的2D接雨水,跟11题非常像,但是又不一样,因为第11题的柱子不占空间,这一题的方块占空间。

我们可以很明显地看到,对于第i个位置可以储藏的雨水,肯定是 min(left, right) - val[i]的,所以我们需要计算左边和右边的高度的最大值,然后再往中间逼近,每一列储存的雨水需要每一步一步慢慢计算累加。

func trap(height []int) int {i, j := 0, len(height) - 1leftMax, rightMax := 0, 0ans := 0for i < j{leftMax = max(leftMax, height[i])rightMax = max(rightMax, height[j])if leftMax < rightMax{           ans += leftMax - height[i]            i ++}else{ans += rightMax - height[j]j--}}return ans
}

滑动窗口

3. 无重复字符的最长子串 - 力扣(LeetCode)

维护一个哈希表,如果元素没有在哈希表里,就加进去。如果元素已经在哈希表里了,那么证明此时已经是最大的了,记录一下,左边窗口收缩到符合条件,右边窗口再扩张,不断地调整滑动窗口的大小。

func lengthOfLongestSubstring(s string) int {hash := map[byte]int{}ans := 0startIndex := 0for i := 0; i < len(s); i ++{for hash[s[i]] > 0{x := s[startIndex]startIndex++delete(hash, x)}       hash[s[i]]++ans = max(ans, len(hash))}return ans
}

438. 找到字符串中所有字母异位词 - 力扣(LeetCode)

其实有点类似第49题的。甚至更简单,这边快速写了个go版本,可以参考下
 

func findAnagrams(s string, p string) []int {hash := map[[26]int]bool{}arr := [26]int{}for i := range p{arr[p[i] - 'a'] ++}hash[arr] = truenewArr := [26]int{}pLen := len(p)ans := []int{}for i := 0; i < len(s); i++{newArr[s[i] - 'a'] ++if i >= pLen{newArr[s[i - pLen] - 'a']--}if hash[newArr]{ans = append(ans, i - pLen + 1)}}return ans
}

子串

560. 和为 K 的子数组 - 力扣(LeetCode)

这边的子数组是要连续的,最基础的就是暴力啊,确定一个起点,一个终点。

其实可以认为是双指针,也可以认为是滑动数组。具体的做法也是这样的。如果这个题目的数组值都是正数就很好优化。不过因为可能存在负数,所以我们只能想办法通过空间换时间。就用前缀和吧。具体怎么做呢,可以参考two-sum,把前缀和放到hash里面,然后如果差值存在的话,就有一种情况了,示例代码如下:

func subarraySum(nums []int, k int) int {cnt, pre := 0, 0m := map[int]int{}m[0] = 1for _, v := range nums{pre += vif m[pre - k] > 0{cnt += m[pre - k]}m[pre] ++}return cnt
}

239. 滑动窗口最大值 - 力扣(LeetCode)

先看一眼,优先队列。但是除了python以外,每个语言的优先队列好像都不太好写。最近在写go,写起来还要自己构造struct,实现interface,因此再看一眼,其实可以按照递减顺序来记录的,但是这里面最好记录的是nums数组的index,这样子才号删除掉。

func maxSlidingWindow(nums []int, k int) []int {arr := []int{}push := func(i int){for len(arr) > 0 && nums[i] >= nums[arr[len(arr) - 1]]{arr = arr[:len(arr) - 1]}arr = append(arr, i)}for i := 0; i < k; i++{push(i)}n := len(nums)ans := make([]int, 1, n - k + 1)ans[0] = nums[arr[0]]for i := k; i < n; i++{push(i);for arr[0] <= i-k{arr = arr[1:]}ans = append(ans, nums[arr[0]])}return ans
}

76. 最小覆盖子串 - 力扣(LeetCode)

滑动窗口把,或者双指针,实际上都是一个东西。

func minWindow(s string, t string) (ans string) {cnt := make([]int, 128)// less 记录还有几个没有满足的字符less := 0for _, ch := range t {if cnt[ch] == 0 {less++}cnt[ch]++}l := 0for r, ch := range s {cnt[ch]--if cnt[ch] == 0 {less--}for less == 0 {if len(ans) == 0 || r-l < len(ans) {ans = s[l : r+1]}if cnt[s[l]] == 0 {less++}cnt[s[l]]++l++}}return
}

普通数组

53. 最大子数组和 - 力扣(LeetCode)

这题直接贪心,从左到右遍历累加,,如果累加起来小于0,那就干脆前面的直接丢弃掉。重新累加。

func maxSubArray(nums []int) int {ans := nums[0]sum := 0for _, v := range nums{sum += vans = max(ans, sum)if sum < 0{sum = 0}}return ans
}

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

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

相关文章

MySQL的子查询:

目录 子查询的相关概念&#xff1a; 子查询的分类&#xff1a; 角度1&#xff1a; 单行子查询&#xff1a; 单行比较操作符&#xff1a; 子查询的空值情况&#xff1a; 多行子查询&#xff1a; 多行比较操作符&#xff1a; ANY和ALL的区别&#xff1a; 子查询为空值的…

Python批处理深度解析:构建高效大规模数据处理系统

引言&#xff1a;批处理的现代价值在大数据时代&#xff0c;批处理&#xff08;Batch Processing&#xff09; 作为数据处理的核心范式&#xff0c;正经历着复兴。尽管实时流处理备受关注&#xff0c;但批处理在数据仓库构建、历史数据分析、报表生成等场景中仍不可替代。Pytho…

是德科技的BenchVue和纳米软件的ATECLOUD有哪些区别?

是德科技的BenchVue和纳米软件的ATECLOUD虽然都是针对仪器仪表测试的软件&#xff0c;但是在功能设计、测试场景、技术架构等方面有着明显的差异。BenchVue&#xff08;是德科技&#xff09;由全球领先的测试测量设备供应商开发&#xff0c;专注于高端仪器控制与数据分析&#…

线上redis的使用

一.String1.缓存玩家单个数据&#xff0c;但是我觉得还是用hash好2.结合过期时间&#xff0c;比如:某个东西结算了&#xff0c;redis记录一下&#xff0c;并设置过期时间3.分布式锁二.Hash1.缓存一个单位的数据&#xff0c;比如&#xff1a;联盟信息2.被封禁的列表&#xff0c;…

【实践记录】github仓库的更新

首先登录&#xff0c;参考&#xff1a;记一次github连接本地git_如何连接github-CSDN博客 SSH&#xff1a; git config --global user.name "GitHubUsername" git config --global user.email "emailexample.com" ssh-keygen -t ed25519 -C "emailex…

Nature图形复现—Graphpad绘制带P值的含数据点的小提琴图

带 P 值的含数据点的小提琴图是一种科研数据可视化图表&#xff0c;它同时呈现数据的分布特征、原始观测值和统计显著性&#xff1a;通过小提琴形状展示概率密度分布&#xff08;反映数据集中趋势和离散程度&#xff09;&#xff0c;叠加抖动散点显示所有原始数据点&#xff08…

mongodb源代码分析createCollection命令由create.idl变成create_gen.cpp过程

mongodb命令db.createCollection(name, options)创建一个新集合。由于 MongoDB 在命令中首次引用集合时会隐式创建集合&#xff0c;因此此方法主要用于创建使用特定选项的新集合。例如&#xff0c;您使用db.createCollection()创建&#xff1a;固定大小集合&#xff1b;集群化集…

达梦(DM8)常用管理SQL命令(3)

达梦(DM8)常用管理SQL命令(3) 1.表空间 -- 查看表空间信息 SQL> SELECT * FROM v$tablespace;-- 查看数据文件 SQL> SELECT * FROM v$datafile;-- 表空间使用情况 SQL> SELECT df.tablespace_name "表空间名称",df.bytes/1024/1024 "总大小(MB)&q…

【Django】-5- ORM的其他用法

一、&#x1f680; ORM 新增数据魔法&#xff01;核心目标教你用 Django ORM 给数据库 新增数据 &#xff01;就像给数据库 “生小数据宝宝”&#x1f476;方法 1&#xff1a;实例化 Model save&#xff08;一步步喂数据&#xff09;obj Feedback() # 实例化 obj.quality d…

Flink Checkpoint机制:大数据流处理的坚固护盾

引言在大数据技术蓬勃发展的当下&#xff0c;数据处理框架层出不穷&#xff0c;Flink 凭借其卓越的流批一体化处理能力&#xff0c;在大数据流处理领域占据了举足轻重的地位 。它以高吞吐量、低延迟和精准的一次性语义等特性&#xff0c;成为众多企业处理实时数据的首选工具。在…

【STM32-HAL】 SPI通信与Flash数据写入实战

文章目录1.参考教程2. 4种时间模式3. 3个编程接口3.1 HAL_StatusTypeDef HAL_SPI_Transmit(...) &#xff1a;3.1.1 参数说明3.1.2 例子3.2 HAL_StatusTypeDef HAL_SPI_Receive(...) &#xff1a;3.2.1参数说明3.2.2 例子3.3 HAL_StatusTypeDef HAL_SPI_TransmitReceive(...) &…

SNR-Aware Low-light Image Enhancement 论文阅读

信噪比感知的低光照图像增强 摘要 本文提出了一种新的低光照图像增强解决方案&#xff0c;通过联合利用信噪比&#xff08;SNR&#xff09;感知的变换器&#xff08;transformer&#xff09;和卷积模型&#xff0c;以空间变化的操作方式动态增强像素。对于极低信噪比&#xff0…

在 Vue3 中使用 Mammoth.js(在 Web 应用中预览 Word 文档)的详解、常见场景、常见问题及最佳解决方案的综合指南

一、Mammoth.js 简介与核心功能 Mammoth.js 是一个专用于将 .docx 文档转换为 HTML 的库,适用于在 Web 应用中预览 Word 文档。其核心特点包括: 语义化转换:基于文档样式(如标题、段落)生成简洁的 HTML 结构,忽略复杂样式(如居中、首行缩进)。 轻量高效:适用于需要快…

2025 年 VSCode 插件离线下载硬核攻略

微软 2025 年起关闭 VSCode 官方市场 .vsix 文件直接下载入口&#xff0c;给企业内网开发者带来极大不便。不过别担心,今天提供一个下载.vsix文件地址。 VSC插件下载 (dreamsoul.cn) 下载好的.vsix文件后&#xff0c;打开vscode的应用&#xff0c;选择右上角...打开&#xff…

[leetcode] 位运算

位运算这类题目奇思妙招很多&#xff0c;优化方法更是非常考验经验积累。 常用小技能&#xff1a; bit_count()&#xff1a;返回整数的二进制表示中1的个数&#xff0c;e.g. x 7 x.bit_count() # 32.bit_length()&#xff1a;返回整数的二进制表示的长度&#xff0c;e.g. …

关于assert()函数,eval()函数,include

一.assert()函数例子assert("strpos($file, ..) false") or die("Detected hacking attempt!");assert("file_exists($file)") or die("That file doesnt exist!");第一个是会检验$file是否有.. &#xff0c;如果有strpos会返回true&…

ICT模拟零件测试方法--电位器测试

ICT模拟零件测试方法–电位器测试 文章目录ICT模拟零件测试方法--电位器测试电位器测试电位器测试配置电位器测试配置电位器测试注意事项电位器测量选项电位器测试 电位器测试测量从 0.1 欧姆到 10M 欧姆的电阻。 本节介绍&#xff1a; 电位器测试配置电位器测试注意事项电位…

wsl2使用宿主机网络方法

在Windows的资源管理器的地址栏输入&#xff1a; %UserProfile% &#xff0c;即可打开当前用户的主目录&#xff0c;创建文件&#xff1a; .wslconfig 输入[experimental]networkingModemirroredautoProxytrue之后重启WSL 管理员身份运行PowerShell&#xff1a; 停止WSL&#x…

当Windows远程桌面出现“身份验证错误。要求的函数不受支持”的问题

当Windows远程桌面出现“身份验证错误。要求的函数不受支持”的问题时&#xff0c;可以参考以下方法解决&#xff1a;修改组策略设置适用于Windows专业版、企业版等有组策略编辑器的系统。1. 按下WinR组合键&#xff0c;输入“gpedit.msc”&#xff0c;打开本地组策略编辑器。2…

零售新范式:开源AI大模型、AI智能名片与S2B2C商城小程序源码驱动下的圈层渗透革命

摘要&#xff1a;在消费圈层化与渠道碎片化的双重冲击下&#xff0c;传统零售渠道的"广撒网"模式逐渐失效。阿里巴巴零售通、京东新通路、国美Plus等零售巨头通过技术赋能重构小店生态&#xff0c;但其本质仍停留于供应链效率提升层面。本文创新性提出"开源AI大…