LeetCode Day3 -- 哈希表

目錄

1.?啥是哈希表?

2.?啥時候用哈希表?

2.1 存在性檢查?→?集合Set

2.2?鍵值映射?→?字典Dict

2.3?頻率統計?→?Dict?or?Counter

3.?LeetCode

3.1?集合

(1)2215?找出兩數組的不同

(2)1207?獨一無二的出現次數

(3)128?最長連續序列

3.2?字典

(1)49?字母異位詞分組

(2)2352?相等行列對

(3)1 兩數之和

?3.3?統計元素出現頻率

(1)1657?確定兩個字符串是否接近


1.?啥是哈希表?

(1)哈希表(Hash Table)是一種通過??鍵值對??(key-value pairs)存儲數據的數據結構,核心是使用??哈希函數??(hash function)將鍵(key)映射到數組的特定位置。

(2)在Python中,哈希表通常有兩種形式:set和dict。

  • set: 存儲唯一元素的集合,不支持鍵值對。

  • dict: 存儲鍵值對,鍵是唯一的。

2.?啥時候用哈希表?

  • 快速查找:如判斷元素是否在集合中(O(1)時間復雜度)。

  • 去重:如獲取唯一元素集合。

  • 計數:利用字典統計元素出現頻率。

  • 映射關系:存儲鍵值對,如緩存、數據庫索引等。

  • 集合運算:如求交集、并集、差集等。

2.1 存在性檢查?→?集合Set

(1)應用場景:

  • 判斷元素是否存在

  • 去重處理

  • 唯一性驗證

  • 交/并/差集運算

(2)實現模板:

def existence_check(data):# 1. 創建哈希集合seen = set()result = []# 2. 遍歷數據for item in data:# 3. 檢查或添加if item not in seen:      # 存在性檢查result.append(item)seen.add(item)        # 記錄訪問# 4. 返回結果return result

2.2?鍵值映射?→?字典Dict

(1)應用場景:

  • 索引-值映射(如兩數之和)

  • 分組統計(如字母異位詞)

  • 緩存實現

  • 頻率統計

(2)實現模板:

def value_mapping(data):# 1. 創建哈希字典mapping = {}# 2. 遍歷數據for item in data:# 3. 檢查或更新映射if item not in mapping:   # 首次出現mapping[item] = ...   # 初始化值else:mapping[item] = ...   # 更新值# 4. 返回結果return mapping

2.3?頻率統計?→?Dict?or?Counter

(1)應用場景:

  • 元素計數

  • Top K 問題

  • 頻率唯一性檢查

  • 字謎判斷

(2)實現模板:

from collections import Counterdef frequency_analysis(data):# 方法1:手動統計freq = {}for item in data:freq[item] = freq.get(item, 0) + 1  # 安全獲取更新# 方法2:Counter簡化版freq = Counter(data)# 3. 處理結果(如找頻率唯一)unique_counts = set()for count in freq.values():if count in unique_counts:return Falseunique_counts.add(count)return True

3.?LeetCode

3.1?集合

(1)2215?找出兩數組的不同

給你兩個下標從?0?開始的整數數組?nums1?和?nums2?,請你返回一個長度為?2?的列表?answer?,其中:answer[0]?是?nums1?中所有?不?存在于?nums2?中的?不同?整數組成的列表;answer[1]?是?nums2?中所有?不?存在于?nums1?中的?不同?整數組成的列表。

class Solution(object):def findDifference(self, nums1, nums2):""":type nums1: List[int]:type nums2: List[int]:rtype: List[List[int]]"""set1 = set(nums1)set2 = set(nums2)result1 = list(set1-set2)    ## 求差集result2 = list(set2-set1)return [result1, result2]

(2)1207?獨一無二的出現次數

給你一個整數數組?arr,如果每個數的出現次數都是獨一無二的,就返回?true;否則返回?false

class Solution(object):def uniqueOccurrences(self, arr):""":type arr: List[int]:rtype: bool"""count = dict()seen = set()for num in arr:## 從字典count中獲取鍵num對應的值。如果鍵num不存在,則返回默認值0count[num] = count.get(num,0) + 1  for value in count.values():if value in seen:return Falseseen.add(value)return True

(3)128?最長連續序列

給定一個未排序的整數數組?nums?,找出數字連續的最長序列(不要求序列元素在原數組中連續)的長度。請你設計并實現時間復雜度為?O(n)?的算法解決此問題。

從集合中的隨機num出發,查看其左(lower)右(higher)最多延伸到哪里。

如果lower(num-1)存在,那么:

①num_set.remove(lower):從集合set中移除當前lower,因為如果從新的num開始查找,則說明當前的lower是和之前的num連續,不可能和新num連續

②length++:當前連續序列長度更新

③lower--:繼續找,看有沒有更小的連續

class Solution(object):def longestConsecutive(self, nums):""":type nums: List[int]:rtype: int"""if not nums:return 0num_set = set(nums)max_len = 0while num_set:num = num_set.pop()  # 隨機取一個元素length = 1lower = num-1       ## 向更小方向擴展while lower:num_set.remove(lower)   length += 1lower -= 1higher = num+1      ## 向更大方向擴展while higher:num_set.remove(higher)length += 1higher += 1max_len = max(max_len, length)return max_len

3.2?字典

(1)49?字母異位詞分組

給你一個字符串數組,請你將字母異位詞(通過重新排列不同單詞或短語的字母而形成的單詞或短語,并使用所有原字母一次)組合在一起。可以按任意順序返回結果列表。

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

輸出:?[["bat"],["nat","tan"],["ate","eat","tea"]]

字母異位詞:包含的字母及其個數完全相同?→?排序后應是完全相同的字符串

創建列表類型的字典,字典的?key?是排好序的字符串,value?是對應的原字符串組成的?

(2)2352?相等行列對

給你一個下標從?0?開始、大小為?n x n?的整數矩陣?grid?,返回滿足?Ri?行和?Cj?列相等的行列對?(Ri, Cj)?的數目如果行和列以相同的順序包含相同的元素(即相等的數組),則認為二者是相等的。

??1.預處理所有行??:將每一行轉換為可哈希對象(如元組),存儲到字典中記錄出現次數

2.??處理列并匹配??:遍歷每一列,將其轉換為相同格式的可哈希對象,檢查是否在行字典中存在,存在則累加次數

from collections import defaultdict
class Solution(object):def equalPairs(self, grid):""":type grid: List[List[int]]:rtype: int"""n=len(grid)row_dict = defaultdict(int)for i in range(n):row_tuple = tuple(grid[i])  ## 將每一行轉換為元組(可哈希對象)row_dict[row_tuple] += 1    ## 記錄每個行元組出現的次數count = 0for j in range(n):## 對每一列:提取各行的第 j 個元素形成元組col_tuple = tuple(grid[i][j] for i in range(n))     if col_tuple in row_dict:           ## 檢查列元組是否在行字典中count += row_dict[col_tuple]    ## 如果存在,累加該行元組的出現次數return count

(3)1 兩數之和

給定一個整數數組?nums?和一個整數目標值?target,請你在該數組中找出?和為目標值?target? 的那?兩個?整數,并返回它們的數組下標。你可以假設每種輸入只會對應一個答案,并且你不能使用兩次相同的元素。你可以按任意順序返回答案。

兩數之和?→?根據當前 num 找其和 target 的差值是否存在于數組中

返回的是下標?→?通過哈希表 {num:index}實現,讓數組數值和下標一一對應

class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""num_map = {}    ## 創建哈希表{num:index}for i, num in enumerate(nums):x = target - nums[i]if x in num_map:        ## 要找的數在哈希表里,直接返回對應索引return [i, num_map[x]]num_map[num] = i        ## 將當前num和其index加入哈希表

?3.3?統計元素出現頻率

(1)1657?確定兩個字符串是否接近

如果可以使用以下操作從一個字符串得到另一個字符串,則認為兩個字符串?接近?:

你可以根據需要對任意一個字符串多次使用這兩種操作。給你兩個字符串,word1?和?word2?。如果?word1??word2?接近?,就返回?true?;否則,返回?false?

兩個字符串接近的條件:

  1. 兩個字符串的長度必須相同(因為操作不會改變長度)。

  2. 兩個字符串包含的字符種類必須相同(即字符集合相同)。

  3. 兩個字符串的字符頻率排序后必須相同(因為操作2允許我們重新分配字符,所以只要頻率的集合相同,就可以通過操作2將一種字符的頻率分配給另一種字符)。

from collections import Counter
class Solution(object):def closeStrings(self, word1, word2):""":type word1: str:type word2: str:rtype: bool"""if len(word1) != len(word2):return Falseif set(word1) != set(word2):return Falsecount1 = Counter(word1)    ## 使用Counter統計字符頻率count2 = Counter(word2)if sorted(count1.values()) == sorted(count2.values()):return Trueelse: return False

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

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

相關文章

三子棋裝置(電賽24E題)K230/STM32全開源

三子棋裝置(電賽24E題)K230/STM32全開源,后續有具體代碼參數講解,幫助大家移植k230代碼import time, os, sysfrom media.sensor import * from media.display import * from media.media import *from machine import UART from m…

終端安全檢測與防御

1. 終端安全風險主要問題:企業網絡中80%的安全事件源于終端,終端成為黑客攻擊的重要目標。攻擊手段:勒索病毒:直接勒索用戶。橫向滲透:通過受控終端攻擊內部服務器。僵尸網絡危害:信息竊取、釣魚網站引導、…

Video_AVI_Packet(2)

博主聲明:內容來自網絡,僅供參考,僅適用于淺了解,如有錯誤,自行甄別,由此引起的后果概不負責 Video_AVI_Packet(2)一、Video Picture Aspect Ratio 與 Active Format Aspect Ratio1.…

八月補丁星期二:微軟修復 111 個漏洞

微軟將在2025 年 8 月補丁星期二修復 111 個漏洞,這一數量與近期平均水平大致相同。 與上個月的情況類似,微軟知道今天發布的漏洞中只有一個已被公開披露,但聲稱沒有證據表明存在野外利用。同樣,截至發布時,唯一的補丁…

《C++進階之繼承多態》【普通類/模板類的繼承 + 父類子類的轉換 + 繼承的作用域 + 子類的默認成員函數】

【普通類/模板類的繼承 父類&子類的轉換 繼承的作用域 子類的默認構造函數】目錄前言:------------------------一、繼承的定義和使用1. 什么使繼承?2. 為什么要引入繼承?3. 怎么使用繼承?① 父類(基類&#xf…

Ubuntu22.04安裝OBS Studio

OBS官網的最新的雖然支持Ubuntu系統,但是只支持最新的24.2版本的,而我的電腦上的Ubuntu的版本是22.04,所以在網上尋求解決辦法,看到了這一片博客,作為參考來實現ubuntu22.04安裝OBS,這里提示一下&#xff0…

Ansible 基本使用

Ansible 清單 靜態主機清單 主機清單支持多種格式,例如ini、yaml、腳本等。 本次課程使用 ini 格式。 #創建主機清單[lykcontroller ~ 13:36:01]# vim inventory#vim添加controllernode1node2node3node4?#測試連接單個服務器[lykcontroller ~ 14:08:18]$ ansibl…

網絡資源模板--基于Android Studio 實現的九寨溝App

目錄 一、測試環境說明 二、項目簡介 三、項目演示 四、部設計詳情(部分) 首頁 購票頁面 五、項目源碼 一、測試環境說明 電腦環境 Windows 11 編寫語言 JAVA 開發軟件 Android Studio (2020) 開發軟件只要大于等于測試版本即可(近幾年官網直接下載也…

系統架構設計師備考之架構設計實踐知識

1.信息系統架構設計理論與實踐1.1.基本概念信息系統架構定義目前關于信息系統架構較為權威的定義有: (1)信息系統架構是系統的結構,由軟件元素、元素外部可見屬性和元素間關系組成。 (2)信息系統架構是軟件…

【IgH EtherCAT】如何利用 RTAI 提供的實時任務和調度機制來構建一個高精度、確定性的工業控制應用

SVG圖展示了系統的分層架構:RTAI實時層:包含RT_TASK、信號量和定時器EtherCAT Master層:主站、域、從站配置和PDO映射EtherCAT網絡層:與實際硬件設備(EL3162模擬輸入、EL2004數字輸出)通信關鍵特點&#xf…

7款熱門智能電視文件管理器橫向評測

7款智能電視文件管理器橫向評測 在智能電視和電視盒子日益普及的今天,一款好用的文件管理器能讓您的數字生活更加便捷。本文為您評測了7款廣受歡迎的TV版文件管理器,助您找到最適合自己的工具。 1. ES文件瀏覽器TV版 ES文件瀏覽器是一款廣受歡迎的多功能…

Python 類元編程(導入時和運行時比較)

導入時和運行時比較 為了正確地做元編程,你必須知道 Python 解釋器什么時候計算各個代碼 塊。Python 程序員會區分“導入時”和“運行時”,不過這兩個術語沒有嚴 格的定義,而且二者之間存在著灰色地帶。在導入時,解釋器會從上到 下…

[git diff] 對比檢查變更 | 提交前復審 | 版本回退

git diff git diff 是 Git 版本控制系統中用于比較文件差異的核心命令,可以顯示工作目錄、暫存區(Index)和倉庫歷史之間的變化。 通過對比不同版本或狀態的文件內容,幫助開發者理解代碼變更。 比較工作目錄與暫存區 運行以下命令查…

【數據可視化-85】海底撈門店數據分析與可視化:Python + pyecharts打造炫酷暗黑主題大屏

🧑 博主簡介:曾任某智慧城市類企業算法總監,目前在美國市場的物流公司從事高級算法工程師一職,深耕人工智能領域,精通python數據挖掘、可視化、機器學習等,發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

物聯網之小白調試網關設備

小伙伴們,你們好呀!我是老寇!跟我一起學習調試網關設備 相信搞過物聯網的朋友,對網關設備非常熟悉,本人以小白的視角,手把手教你調試網關設備! 工作中使用的是Ubuntu操作系統,因此&a…

Node.js特訓專欄-實戰進階:22. Docker容器化部署

?? 歡迎來到 Node.js 實戰專欄!在這里,每一行代碼都是解鎖高性能應用的鑰匙,讓我們一起開啟 Node.js 的奇妙開發之旅! Node.js 特訓專欄主頁 專欄內容規劃詳情 我將從Docker容器化部署的基礎概念入手,介紹Node.js應用容器化的步驟,包括創建Dockerfile、構建鏡像、運行…

eclipse嵌入式編譯速度慢

eclipse 嵌入式 編譯 速度慢 同一個項目,eclipse編譯速度越來越慢,一開始幾秒鐘編譯完,后面要10分鐘。只需要將以下兩個程序卸載重新安裝即可。

編譯Android版本可用的高版本iproute2

背景: Android自帶的iproute2 太老,很多指令格式不支持 直接基于Android源碼,替換源碼下iproute2 代碼編譯新版,報錯太多,于是改用Android NDK工具編譯 環境: android-ndk-r25c-linux.zip 下載鏈接&am…

JavaScript的fetch函數的用法

基本語法fetch函數用于發起網絡請求,返回一個Promise對象。基本語法如下:fetch(url, options).then(response > response.json()).then(data > console.log(data)).catch(error > console.error(Error:, error));GET請求發起一個簡單的GET請求&…

Json和XML文件相互轉化

目錄 一.XML轉Json文件 示例:將XML轉換為JSON 依賴準備 Java代碼示例 代碼詳細講解 二.Json轉XML文件 示例:將JSON轉換為XML 依賴準備 Java代碼示例 代碼詳細講解 關鍵代碼解析 將JSON轉換為XML 寫入文件 示例輸入與輸出 三.具有相同功能的…