LeetCode 熱題100 刷題筆記

一:哈希表

一般哈希表都是用來快速判斷一個元素是否出現集合里。

直白來講其實數組就是一張哈希表,哈希表中關鍵碼就是數組的索引下標,然后通過下標直接訪問數組中的元素。

1.兩數之和

題目鏈接:. - 力扣(LeetCode)

// 哈希表
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {std::unordered_map <int, int> map;for(int i = 0; i < nums.size(); i++){auto iter = map.find(target - nums[i]);if(iter != map.end()){return {iter->second, i};}else{map.insert(pair<int, int>(nums[i], i));}}return {};}
};

本題其實有四個重點:

  • 為什么會想到用哈希表

本題呢,我就需要一個集合來存放我們遍歷過的元素,然后在遍歷數組的時候去詢問這個集合,某元素是否遍歷過,也就是 是否出現在這個集合。那么我們就應該想到使用哈希法了。

  • 哈希表為什么用map

這道題目中并不需要key有序,選擇std::unordered_map 效率更高!

  • 本題map是用來存什么的

map目的用來存放我們訪問過的元素,因為遍歷數組的時候,需要記錄我們之前遍歷過哪些元素和對應的下標,這樣才能找到與當前元素相匹配的(也就是相加等于target)

  • map中的key和value用來存什么的

這道題 我們需要 給出一個元素,判斷這個元素是否出現過,如果出現過,返回這個元素的下標。

那么判斷元素是否出現,這個元素就要作為key,所以數組中的元素作為key,有key對應的就是value,value用來存下標。

所以 map中的存儲結構為 {key:數據元素,value:數組元素對應的下標}。

?2. 字母異位詞分組

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {map<string, int> myhash;vector<vector<string>> myAns;int cint =0;for(int i = 0; i<strs.size(); i++){string temString = strs[i];sort(temString.begin(), temString.end());auto iter = myhash.find(temString);if(iter == myhash.end()){myAns.push_back(vector<string>());myAns.back().push_back(strs[i]);myhash[temString]=cint;cint ++;}else{int index = myhash[temString];myAns[index].push_back(strs[i]);}}return myAns;}
};

?3.最長連續序列

class Solution {
public:int longestConsecutive(vector<int>& nums) {unordered_set<int> myset;for(const int& num : nums){myset.insert(num);}int longestStreak = 0;for(const int& num : myset){if(myset.count(num-1) == 0){int currentNum = num;int currentStreak = 1;while(myset.count(currentNum +1)){currentNum = currentNum + 1;currentStreak = currentStreak + 1; }longestStreak = max(longestStreak, currentStreak);}}return longestStreak;}
};

?二:雙指針

1.移動零

// 使用雙指針,左指針指向當前已經處理好的序列的尾部,右指針指向待處理序列的頭部。
// 右指針不斷向右移動,每次右指針指向非零數,則將左右指針對應的數交換,同時左指針右移
class Solution {
public:void moveZeroes(vector<int>& nums) {int n = nums.size(), left = 0, right = 0;while (right < n) {if (nums[right]) {swap(nums[left], nums[right]);left++;}right++;}}
};

思路:通過右指針來遍歷數組,左指針始終指向處理好的序列的尾部。

?2.盛最多水的容器

/* 算法流程:
1.初始化: 雙指針 i , j 分列水槽左右兩端;
2.循環收窄: 直至雙指針相遇時跳出;a.更新面積最大值 res;b.選定兩板高度中的短板,向中間收窄一格;
3.返回值: 返回面積最大值 res 即可; */class Solution {
public:int maxArea(vector<int>& height) {int i = 0, j = height.size() - 1, res = 0;while(i < j) {res = height[i] < height[j] ? max(res, (j - i) * height[i++]): max(res, (j - i) * height[j--]); }return res;}
};

3.三數之和

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;sort(nums.begin(), nums.end());// 找出a + b + c = 0// a = nums[i], b = nums[left], c = nums[right]for (int i = 0; i < nums.size(); i++) {// 排序之后如果第一個元素已經大于零,那么無論如何組合都不可能湊成三元組,直接返回結果就可以了if (nums[i] > 0) {return result;}// 錯誤去重a方法,將會漏掉-1,-1,2 這種情況/*if (nums[i] == nums[i + 1]) {continue;}*/// 正確去重a方法if (i > 0 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.size() - 1;while (right > left) {// 去重復邏輯如果放在這里,0,0,0 的情況,可能直接導致 right<=left 了,從而漏掉了 0,0,0 這種三元組/*while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;*/if (nums[i] + nums[left] + nums[right] > 0) right--;else if (nums[i] + nums[left] + nums[right] < 0) left++;else {result.push_back(vector<int>{nums[i], nums[left], nums[right]});// 去重邏輯應該放在找到一個三元組之后,對b 和 c去重while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;// 找到答案時,雙指針同時收縮right--;left++;}}}return result;}
};

?思路:

首先將數組排序,然后有一層for循環,i從下標0的地方開始,同時定一個下標left 定義在i+1的位置上,定義下標right 在數組結尾的位置上。

依然還是在數組中找到 abc 使得a + b +c =0,我們這里相當于 a = nums[i],b = nums[left],c = nums[right]。

接下來如何移動left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就說明 此時三數之和大了,因為數組是排序后了,所以right下標就應該向左移動,這樣才能讓三數之和小一些。

如果 nums[i] + nums[left] + nums[right] < 0 說明 此時 三數之和小了,left 就向右移動,才能讓三數之和大一些,直到left與right相遇為止。

4.接雨水?

class Solution {
public:int trap(vector<int>& height) {int ans = 0;int left = 0, right = height.size() - 1;int leftMax = 0, rightMax = 0;while (left < right) {leftMax = max(leftMax, height[left]);rightMax = max(rightMax, height[right]);if (height[left] < height[right]) {ans += leftMax - height[left];++left;} else {ans += rightMax - height[right];--right;}}return ans;}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715220.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715220.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715220.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Javaweb之SpringBootWeb案例之自動配置的原理分析的詳細解析

3.2.3 原理分析 3.2.3.1 源碼跟蹤 前面我們講解了在項目當中引入第三方依賴之后&#xff0c;如何加載第三方依賴中定義好的bean對象以及配置類&#xff0c;從而完成自動配置操作。那下面我們通過源碼跟蹤的形式來剖析下SpringBoot底層到底是如何完成自動配置的。 源碼跟蹤技巧…

[VSCode插件] 輕量級靜態博客 - MDBlog

MDBlog VSCode插件&#xff0c;基于Markdown的輕量級靜態博客系統&#xff0c;同時支持導出為可以部署的靜態博客。 倉庫 MDBlog 1. Features 博客基礎功能&#xff1a;分類管理、文章管理、自動生成索引快捷指令&#xff1a;快捷輸入表格、mermaid、wavedrom、代碼塊發布&a…

[electron雜項] 記錄學習electron碰到問題(持續更新)

無法生成 node_modules文件夾 如前面所說的&#xff0c;如果要用vscode的代碼補全&#xff0c;那么就要把 electron.d.ts文件拷貝到項目的 node_modules文件夾下。一般情況下是通過npm install生成 node_modules 文件夾。但是有時發現根本生成不了生成了一個 xxxxlock的文件。…

Redis--內存回收機制詳解

什么是內存回收機制? 眾所周知Redis之所以性能高是因為數據都存在內存中&#xff0c;內存是很寶貴的&#xff0c;Redis的內存回收機制本質就是處理達到過期時間的key-value&#xff0c;以及當內存到達最大使用值時候觸發的內存淘汰策略。 Redis數據刪除的策略有哪些&#xf…

軟考重點題解析-基礎知識

1.加密技術&#xff1a;分為對稱加密技術&#xff1a;文件的加密和解密使用相同的密鑰 和 非對稱加密技術&#xff1a;加密和解密不同的密鑰&#xff0c;分別是公開密鑰和私有密鑰。 例題&#xff1a;若A,B兩人分別在認證機構&#xff08;CA&#xff09;M,N處獲得證書&…

項目準備March

Nginx主要用來作為Http服務器&#xff0c;要實現Tomcat的負載均衡&#xff0c;就可以通過Nginx來實現。 正向代理代理的是客戶端&#xff0c;反向代理代理的是服務端。SpringBoot采用約定優于配置的思想&#xff0c;簡化Spring項目的配置開發。 前端請求其實并未直接發送到后…

php連接hdfs初步探索

一、phdfs拓展 結果&#xff1a;暫時舍棄 安裝此拓展時&#xff0c;無法make成功&#xff0c;因為缺少hdfs.n文件。 換了其他版本的拓展包&#xff0c;并編譯都沒有找到此文件。 后搜到官網的相關資料&#xff0c;此hdfs.h的文件路徑的地址是$HADOOP_HDFS_HOME/include/hdfs…

數據增加

目錄 增加數據 實現數據增加&#xff0c;保存新的內容 注意 Oracle從入門到總裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 增加數據 由于 emp 表中的數據對日后的開發依然有用處&#xff0c;所以在講解更新之前 建議將emp 表數據做一個復制。將…

linux如何查看磁盤占用情況

要查看Linux系統中磁盤的占用情況&#xff0c;可以使用一些命令來獲取相關信息。以下是一些常用的命令&#xff1a; df命令&#xff1a; df命令用于顯示文件系統的磁盤空間使用情況&#xff0c;包括磁盤分區的總空間、已用空間、可用空間等信息。 df -h使用 -h 參數可以以人類可…

Golang 簡介與基本語法學習

Go&#xff0c;也被稱為 Golang&#xff0c;是一門由 Google 設計的開源編程語言。它旨在提供高效的開發體驗&#xff0c;同時具備并發性、內存安全和簡潔性。本篇博客將介紹 Golang 的基本語法和一些示例&#xff0c;幫助讀者快速入門這門令人著迷的語言。 簡介 Go 語言的設…

一個腳本兩步計算材料Raman譜(附數據處理和繪圖腳本)

在以往推送中已經介紹了相當多的計算材料Raman的方法&#xff0c;使用的軟件主要為Phonopy-Spectroscopy&#xff0c;相關軟件還有vasp&#xff0c;phonopy&#xff0c;phono3py等。 Phonopy-Spectroscopy計算材料紅外和Raman光譜 Phonopy-Spectroscopy 計算紅外和拉曼光譜 也…

經典面試題從瀏覽器輸入URL到頁面加載的過程?

從輸入URL到頁面加載的過程涉及多個步驟&#xff0c;包括DNS解析、TCP連接、發送HTTP請求、服務器處理請求、瀏覽器解析渲染頁面以及斷開連接。具體如下&#xff1a; DNS解析&#xff1a;當你在瀏覽器中輸入一個URL時&#xff0c;瀏覽器首先需要將域名轉換為IP地址。這個過程稱…

QT中提升為自定義控件的方法

一&#xff0e;介紹 提升為自定義的控件用法&#xff1a;先要寫好自定義控件后&#xff0c;再添加&#xff0c;在頻繁使用同一控件時&#xff0c;的確非常的高效。 同時導入別人開發的控件操作方法也類似。 二&#xff0e;下面以自定義的QPushButton作一個很簡單的例子&#x…

MongoDB聚合運算符:$bottomN

$bottomN聚合運算符返回分組中指定順序的最后n個元素&#xff0c;如果分組中的元素數量小于n&#xff0c;則返回分組的全部元素。從MongoDB5.2開始支持。 語法 {$bottomN:{n: <expression>,sortBy: { <field1>: <sort order>, <field2>: <sort or…

精品SSM的教學管理系統課程作業成績

《[含文檔PPT源碼等]精品基于SSM的教學管理系統[包運行成功]》該項目含有源碼、文檔、PPT、配套開發軟件、軟件安裝教程、項目發布教程、包運行成功&#xff01; 軟件開發環境及開發工具&#xff1a; Java——涉及技術&#xff1a; 前端使用技術&#xff1a;HTML5,CSS3、Jav…

esp32 C3和S3 開發板電流對比

出去好奇用合宙家的 lot power 測了兩塊開發板的運行電流。 esp32 S3 (嘉立創開發板 8N8 版本) 模式 電流downloa模式49 毫安空代碼91 毫安light mode27 毫安deep mode25 毫安delay 40 毫安 esp32 C3 無串口芯片 &#xff08;合宙 9.9 元版本&#xff09; 模式 …

uniapp npx update-browserslist-db@lates 問題解決

在uniapp運行項目時&#xff0c;會有這種報錯&#xff0c;其實這是表明browserslistlatest版本低了&#xff0c;在催你升級版本&#xff0c;browserslistlatest是用來支持解析css用的&#xff0c;當然&#xff0c;你也可以直接忽略這個報錯提示&#xff0c;也可以正常運行項目。…

探索數據結構:深入了解順序表的奧秘

?? 歡迎大家來到貝蒂大講堂?? &#x1f388;&#x1f388;養成好習慣&#xff0c;先贊后看哦~&#x1f388;&#x1f388; 所屬專欄&#xff1a;數據結構與算法 貝蒂的主頁&#xff1a;Betty’s blog 1. 什么是順序表 順序表是用一段物理地址連續的存儲單元依次存儲數據元…

【初中生講機器學習】13. 決策樹算法一萬字詳解!一篇帶你看懂!

創建時間&#xff1a;2024-03-02 最后編輯時間&#xff1a;2024-03-02 作者&#xff1a;Geeker_LStar 你好呀~這里是 Geeker_LStar 的人工智能學習專欄&#xff0c;很高興遇見你~ 我是 Geeker_LStar&#xff0c;一名初三學生&#xff0c;熱愛計算機和數學&#xff0c;我們一起加…

取送貨問題(Pickup and Delivery Problem)

取送貨問題及其變體 廣義取送貨問題&#xff08;General Pickup and Delivery Problems&#xff0c;GPDP&#xff09;可以分為兩類&#xff1a; Vehicle Routing Problems with Backhauls&#xff0c;VRPB&#xff1a;從配送中心&#xff08;depot&#xff09;取貨運輸貨物到客…