LeetCode 哈希章節

簡單

1. 兩數之和

給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 target 的那 兩個 整數,并返回它們的數組下標。

你可以假設每種輸入只會對應一個答案,并且你不能使用兩次相同的元素。

你可以按任意順序返回答案。

示例 1:

輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因為 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

輸入:nums = [3,2,4], target = 6
輸出:[1,2]

示例 3:

輸入:nums = [3,3], target = 6
輸出:[0,1]

提示:

  • 2 <= nums.length <= 10^4
  • -10^9 <= nums[i] <= 10^9
  • -10^9 <= target <= 10^9
  • 只會存在一個有效答案

通過遍歷vector不斷查找如果找到對應的另一個數返回,未找到再插入哈希表,不斷循環。

vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> hash;for (int i = 0; i < nums.size(); ++i) {auto it = hash.find(target - nums[i]);if (it != hash.end())return {i, it->second};hash[nums[i]] = i; // 插入哈希表}return {};
}

202. 快樂數

編寫一個算法來判斷一個數 n 是不是快樂數。

「快樂數」 定義為:

  • 對于一個正整數,每一次將該數替換為它每個位置上的數字的平方和。
  • 然后重復這個過程直到這個數變為 1,也可能是 無限循環 但始終變不到 1。
  • 如果這個過程 結果為 1,那么這個數就是快樂數。

如果 n快樂數 就返回 true ;不是,則返回 false

示例 1:

輸入:n = 19
輸出:true
解釋:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

示例 2:

輸入:n = 2
輸出:false

提示:

  • 1 <= n <= 2^31 - 1

有兩種情況,是快樂數,不斷計算能得到1;不是快樂數,不斷計算會遇到之前出現過的數,會無限循環。與這題141. 環形鏈表類似,可以通過哈希表來記錄出現過的次數即可。

int getHappyNum(int n) {int ret = 0;while (n) {int x = n % 10;ret += x * x;n /= 10;}return ret;
}
bool isHappy(int n) {unordered_map<int, int> hash;while (1) {n = getHappyNum(n);if (n == 1)return true;hash[n]++;if (hash[n] > 1)return false;}return false;
}

217. 存在重復元素

給你一個整數數組 nums 。如果任一值在數組中出現 至少兩次 ,返回 true ;如果數組中每個元素互不相同,返回 false

示例 1:

**輸入:**nums = [1,2,3,1]

**輸出:**true

解釋:

元素 1 在下標 0 和 3 出現。

示例 2:

**輸入:**nums = [1,2,3,4]

**輸出:**false

解釋:

所有元素都不同。

示例 3:

**輸入:**nums = [1,1,1,3,3,4,3,2,4,2]

**輸出:**true

提示:

  • 1 <= nums.length <= 10^5
  • -10^9 <= nums[i] <= 10^9
bool containsDuplicate(vector<int>& nums) {unordered_set<int> hash;for (int i : nums) {if (hash.find(i) != hash.end())return true;hash.insert(i);}return false;
}

219. 存在重復元素 II

給你一個整數數組 nums 和一個整數 k ,判斷數組中是否存在兩個 不同的索引 ij ,滿足 nums[i] == nums[j]abs(i - j) <= k 。如果存在,返回 true ;否則,返回 false

示例 1:

輸入:nums = [1,2,3,1], k = 3
輸出:true

示例 2:

輸入:nums = [1,0,1,1], k = 1
輸出:true

示例 3:

輸入:nums = [1,2,3,1,2,3], k = 2
輸出:false

提示:

  • 1 <= nums.length <= 10^5
  • -10^9 <= nums[i] <= 10^9
  • 0 <= k <= 10^5

借助貪心思想,哈希表存儲對應最新的下標,可以使abs(i - j)最小。

bool containsNearbyDuplicate(vector<int>& nums, int k) {unordered_map<int, int> hash;for (int i = 0; i < nums.size(); ++i) {if (hash.count(nums[i]))if (i - hash[nums[i]] <= k)return true;hash[nums[i]] = i; // 貪心}return false;
}

面試題 01.02. 判定是否互為字符重排

給定兩個由小寫字母組成的字符串 s1s2,請編寫一個程序,確定其中一個字符串的字符重新排列后,能否變成另一個字符串。

示例 1:

輸入: s1 = "abc", s2 = "bca"
輸出: true 

示例 2:

輸入: s1 = "abc", s2 = "bad"
輸出: false

說明:

  • 0 <= len(s1) <= 100
  • 0 <= len(s2) <= 100

通過哈希表統計字符出現次數是否相等,比排序時間復雜度更低。

bool CheckPermutation(string s1, string s2) {if (s1.size() != s2.size())return false;int hash[128] = {0};for (char ch : s1)++hash[ch];for (char ch : s2) {--hash[ch];if (hash[ch] < 0)return false;}return true;
}

中等

49. 字母異位詞分組

給你一個字符串數組,請你將 字母異位詞 組合在一起。可以按任意順序返回結果列表。

字母異位詞 是由重新排列源單詞的所有字母得到的一個新單詞。

示例 1:

輸入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
輸出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

輸入: strs = [""]
輸出: [[""]]

示例 3:

輸入: strs = ["a"]
輸出: [["a"]]

提示:

  • 1 <= strs.length <= 10^4
  • 0 <= strs[i].length <= 100
  • strs[i] 僅包含小寫字母

排序哈希

將每個string排序后作為key,建立哈希表。

vector<vector<string>> groupAnagrams(vector<string>& strs) {vector<vector<string>> ans;unordered_map<string, vector<string>> hash;for (auto s : strs) {string tmp = s;sort(tmp.begin(), tmp.end());hash[tmp].push_back(s);}for (auto p : hash)ans.push_back(p.second);return ans;
}

計算哈希

用類似哈希的思想建立數組array<int, 26>對26個字母進行計數,再通過array<int, 26>作為key,建立哈希表。

vector<vector<string>> groupAnagrams(vector<string>& strs) {vector<vector<string>> ans;map<array<int, 26>, vector<string>> hash;array<int, 26> word_hash;for (auto s : strs) {word_hash.fill(0);for (auto& ch : s)word_hash[ch - 'a']++;hash[word_hash].push_back(s);}for (auto p : hash)ans.push_back(p.second);return ans; 
}

128. 最長連續序列

給定一個未排序的整數數組 nums ,找出數字連續的最長序列(不要求序列元素在原數組中連續)的長度。

請你設計并實現時間復雜度為 O(n) 的算法解決此問題。

示例 1:

輸入:nums = [100,4,200,1,3,2]
輸出:4
解釋:最長數字連續序列是 [1, 2, 3, 4]。它的長度為 4。

示例 2:

輸入:nums = [0,3,7,2,5,8,4,6,0,1]
輸出:9

提示:

  • 0 <= nums.length <= 10^5
  • -10^9 <= nums[i] <= 10^9

通過unoredered_set(構造平均時間復雜度O(n))去重,以及unoredered_set(查找平均時間復雜度O(1))來完成對相鄰值的查找比對。判斷是不是連續序列起點降低循環次數,再循環查找相鄰值進行計數。

int longestConsecutive(vector<int>& nums) {int ans = 0;unordered_set<int> num_set;for (auto num : nums)num_set.insert(num);for (auto num : num_set) {// 如果是連續序列的起點if (!num_set.count(num - 1)) {int cur = num;int count = 1;while (num_set.count(num + 1)) {num++;count++;}ans = max(count, ans);}}return ans;
}

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

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

相關文章

WLAN(無線局域網)安全

WLAN安全涉及到保護無線局域網免受各種威脅和攻擊&#xff0c;以確保數據的保密性、完整性和可用性。以下是關于WLAN安全的多方面介紹&#xff1a; 一、主要安全威脅 竊聽&#xff1a;攻擊者利用特殊設備監聽無線信號&#xff0c;獲取傳輸中的數據&#xff0c;如用戶的賬號密…

江科大51單片機筆記【11】AT24C02(I2C總線)

一、存儲器 1.介紹 RAM的特點是存儲速度特別快&#xff0c;但是掉電會丟失&#xff1b;ROM的特點是存儲速度特別慢&#xff0c;但是掉電不會丟失 SRAM是所有存儲器最快的&#xff0c;一般用于電腦的CPU高速緩存&#xff0c;容量相對較少&#xff0c;成本較高&#xff1b;DRAM…

【C++指南】一文總結C++類和對象【中】

&#x1f31f; 各位看官好&#xff0c;我是egoist2023&#xff01; &#x1f30d; 種一棵樹最好是十年前&#xff0c;其次是現在&#xff01; &#x1f680; 今天來學習C類和對象的語法知識。注意&#xff1a;在本章節中&#xff0c;小編會以Date類舉例 &#x1f44d; 如果覺得…

PgSql 操作技巧

1、查詢數據導出csv數據 \COPY (SELECT w.* from t_sys_warn w ) TO /home/cuadmin/warn_output.csv WITH CSV HEADER;2、導出sql Insert語句 pg_dump -U 用戶名 -h 主機名 -p 端口號 -d 數據庫名 --inserts -t 表名 > 導出文件.sqlpg_dump -U username -d dbname -t tabl…

Unity ES3保存類的問題

有以下一個物品類 public class Item_Base//基礎物品 { public string ID; private Attribute_Data Item_attribute new(); } 當使用ES3保存這個類時&#xff0c;Item_attribute的數據不會被保存&#xff0c;因為它是私有private ES3保存類時&#xff0c;只會保存…

react基本功

useLayoutEffect useLayoutEffect 用于在瀏覽器重新繪制屏幕之前同步執行代碼。它與 useEffect 相同,但執行時機不同。 主要特點 執行時機:useLayoutEffect 在 DOM 更新完成后同步執行,但在瀏覽器繪制之前。這使得它可以在瀏覽器渲染之前讀取和修改 DOM,避免視覺上的閃爍…

Spring Boot筆記(上)

01 概要 Spring Boot 是 Java 領域最流行的 快速開發框架&#xff0c;專為簡化 Spring 應用的初始搭建和開發而設計。 一、Spring Boot 解決了什么問題&#xff1f; 傳統 Spring 痛點 ? 繁瑣的 XML 配置 ? 需要手動管理依賴版本 ? 部署依賴外部 Web 服務器&#xff08;如 …

目標檢測YOLO實戰應用案例100講-基于毫米波雷達的多目標檢測 (續)

目錄 3.2 改進的CFAR目標檢測算法 3.3 算法步驟描述 3.4 實驗結果與分析 基于VGG16-Net的毫米波雷達目標檢測算法 4.1 VGG16-Net網絡模型 4.2 改進VGG16-Net網絡的目標檢測算法 4.3 算法步驟描述 4.4 實驗結果與分析 知識拓展 基于毫米波雷達的多目標檢測:使…

gitsubtree怎么添加新的子倉庫

要使用 git subtree 添加一個新的子倉庫&#xff0c;可以按照以下步驟操作&#xff1a; 1. 添加子倉庫 使用 git subtree add 命令將子倉庫的內容添加到主倉庫的指定目錄中。命令格式如下&#xff1a; git subtree add --prefix<子目錄路徑> <子倉庫地址> <子…

文本轉語音-音畫適時推送rtsp并播放

文本語音 rtsp適時播放叫號系統的底層邏輯 發布Linux, unix socket 和window win32做為音頻源的 python10下的(ffmpeg version 7.1) 可運行版本. 這兩天在弄這個&#xff0c;前2篇是通過虛擬聲卡&#xff0c;達到了最簡單的一個邏輯&#xff0c;播放文本就從聲卡發聲&#xff0…

從0開始的操作系統手搓教程33:掛載我們的文件系統

目錄 代碼實現 添加到初始化上 上電看現象 掛載分區可能是一些朋友不理解的——實際上掛載就是將我們的文件系統封裝好了的設備&#xff08;硬盤啊&#xff0c;SD卡啊&#xff0c;U盤啊等等&#xff09;&#xff0c;掛到我們的默認分區路徑下。這樣我們就能訪問到了&#xff…

【圖片批量轉換合并PDF】多個文件夾的圖片以文件夾為單位批量合并成一個PDF,基于wpf的實現方案

項目背景: 多個圖片分布在不同文件夾,如何以文件夾為單位批量合并成一個PDF,還要保證文件夾里面圖片大小和順序 實現功能: 1、單張圖片的轉換PDF:一張圖臨時轉一下 2、多張圖片轉換成PDF:多張圖單獨轉成PDF 3、多級目錄多張圖轉換成PDF:多級目錄多張圖單獨轉成多個PDF…

如何用Kimi生成PPT?秒出PPT更高效!

做PPT是不是總是讓你頭疼&#xff1f;&#x1f629; 快速制作出專業的PPT&#xff0c;今天我們要推薦兩款超級好用的AI工具——Kimi 和 秒出PPT&#xff01;我們來看看哪一款更適合你吧&#xff01;&#x1f680; &#x1f947; Kimi&#xff1a;讓PPT制作更輕松 Kimi的生成效…

從 MongoDB 到 TDengine,沃太能源實現 18 倍寫入性能提升

導讀 沃太能源是國內領先儲能設備生產廠商&#xff0c;數十萬儲能終端遍布世界各地。此前使用 MongoDB 存儲時序數據&#xff0c;但隨著設備測點增加&#xff0c;MongoDB 在存儲效率、寫入性能、查詢性能等方面暴露出短板。經過對比&#xff0c;沃太能源選擇了專業時序數據庫 …

數據庫基本建表操作

1.登錄數據庫并創建數據庫db_ck 創建完成后使用到我們創建的數據庫。 2.創建表t_hero 根據hero屬性包括&#xff08;id&#xff0c;name&#xff0c;nickname&#xff0c;age&#xff0c;gender&#xff0c;address&#xff0c;weapon&#xff0c;types&#xff09; 創建完…

OkHttp 之任務調度模塊源碼分析

一、引言 在現代網絡應用開發中&#xff0c;高效的任務調度機制對于提升系統性能和用戶體驗至關重要。OkHttp 作為一款廣泛使用的高性能 HTTP 客戶端庫&#xff0c;其任務調度模塊在處理網絡請求的并發、排隊和執行等方面發揮著關鍵作用。本文將深入 OkHttp 源碼&#xff0c;詳…

復現無人機的項目,項目名稱為Evidential Detection and Tracking Collaboration

項目名稱為Evidential Detection and Tracking Collaboration&#xff0c;主要用于強大的反無人機系統&#xff0c;涉及新問題、基準和算法研究。下面介紹項目的復現步驟&#xff1a; 安裝環境&#xff1a;使用Anaconda創建并激活名為edtc的虛擬環境&#xff0c;Python版本為3…

QwQ-32B 開源!本地部署+微調教程來了

今天&#xff0c;通義千問開源了推理模型QwQ-32B QwQ-32B 在一系列基準測試中進行了評估&#xff0c;測試了數學推理、編程能力和通用能力。以下結果展示了 QwQ-32B 與其他領先模型的性能對比&#xff0c;包括 DeepSeek-R1-Distilled-Qwen-32B、DeepSeek-R1-Distilled-Llama-7…

如何利用 Excel 表格實現精準文件批量重命名教程

在處理大量文件時&#xff0c;有時需要根據特定規則對文件名進行調整。如果您的文件名和新名稱之間存在一對多的關系&#xff0c;并且這種關系可以通過 Excel 表格來管理&#xff0c;那么使用“簡鹿文件批量重命名”軟件中的“匹配對應名稱命名”功能將是一個高效的選擇。接下來…

開關模式電源轉換器 EMI/EMC 的集成仿真

介紹 在電力電子領域&#xff0c;電磁干擾 &#xff08;EMI&#xff09; 和電磁兼容性 &#xff08;EMC&#xff09; 問題可以決定設計的成敗。開關模式電源轉換器雖然高效且緊湊&#xff0c;但卻是電磁噪聲的常見來源&#xff0c;可能會對附近的組件和系統造成嚴重破壞。隨著…