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
英文地址,請注明出處:http://en.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大…