【Leetcode刷題隨筆】349. 兩個數組的交集

1. 題目描述

給定兩個數組nums1和nums2,返回它們的交集。輸出結果中的每個元素一定是唯一的。我們可以不考慮輸出結果的順序。
示例1:
輸入:nums1 = [1,2,2,1], nums2 = [2,2]
輸出:[2]
題目條件:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

2. 解題思路

2.1 數組比較法(適用于題目條件限制了數組范圍和元素范圍的情況)

  • 定義一個空數組cuontnums用于存儲較短的那個數組中元素出現次數
  • 遍歷另一個數組的元素,看是否在countnums中存在,如果存在則放入結果數組,并把countnums中對應元素清零(防止重復)
  • 返回結果數組

2.2 哈希表法(適用于任意整數元素范圍的情況)

哈希表相比固定數組的優勢是哈希表可以處理任意整數,而不僅僅是0到1000之間的數,這樣更靈活。原來的方法有潛在越界風險,哈希表能解決這個問題。但同時,帶來了一定的復雜度,這一部分用C++中的unorder_set來實現,如果用C語言則需要導入第三方庫(如 uthash),因為C語言沒有原生的unordered_set。

哈希表實現邏輯如下:

  • 定義哈希表結構體:存儲數字及其出現次數。
  • 統計 nums1 的元素:將 nums1 中的數字插入哈希表,記錄出現次數。
  • 遍歷 nums2 檢查交集:若數字存在于哈希表中,則加入結果數組,并根據需求減少計數(支持重復)或刪除鍵(去重)。
  • 動態管理內存:釋放哈希表內存

3. 代碼實現(C語言)

3.1 數組比較法

int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) {int countnums[1001] = {0}; // 統計nums1中數字出現的次數(題目條件:元素值范圍0~1000)int lesssize = nums1Size < nums2Size ? nums1Size : nums2Size; //找到更短的數組,這是最大交集長度int *result = (int*)calloc(lesssize, sizeof(int)); //動態分配內存空間并初始化為0int resultindex = 0;for(int i = 0; i < nums1Size; i++){countnums[nums1[i]]++; //遍歷nums1,統計每個數字出現的次數到countnums1中}for(int i = 0; i < nums2Size; i++){//遍歷nums2,若 nums2[i] 在 nums1 中存在(計數>0),//如果存在,就將該數字添加到結果數組,并增加結果索引//同時將countnums1對應的位置設為0,避免重復添加。if(countnums[nums2[i]] > 0){result[resultindex] = nums2[i];resultindex++;countnums[nums2[i]] = 0; }}*returnSize = resultindex;return result;
}

有一個點說明的是,如果不考慮去除交集中的重復,countnums[nums2[i]] = 0改為 countnums[nums2[i]]- - 即可。

3.2哈希表法

C++實現

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> result_set; // 存放結果,之所以用set是為了給結果集去重unordered_set<int> nums_set(nums1.begin(), nums1.end());for (int num : nums2) {// 發現nums2的元素 在nums_set里又出現過if (nums_set.find(num) != nums_set.end()) {result_set.insert(num);}}return vector<int>(result_set.begin(), result_set.end());}
};

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

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

相關文章

Unity打包安卓失敗 Build failure 解決方法

【Unity】打包安卓失敗 Build failure 的解決方法_com.android.build.gradle.internal.res.linkapplicat-CSDN博客 unity在打包時設置手機屏幕橫屏豎屏的方法_unity打包默認橫屏-CSDN博客

Window、CentOs、Ubuntu 安裝 docker

Window 版本 網址&#xff1a;https://www.docker.com/ 下載 下載完成后&#xff0c;雙擊安裝就可以了 Centos 版本 卸載 Docker &#xff08;可選&#xff09; yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-log…

Matlab自學筆記五十四:符號數學工具箱和符號運算、符號求解、繪圖

1.什么是符號數學工具箱&#xff1f; 符號數學工具箱是Matlab針對符號對象的運算功能&#xff0c;它引入了一種特殊的數據類型 - 符號對象&#xff1b; 該數據類型包括符號數字&#xff0c;符號變量&#xff0c;符號表達式和符號函數&#xff0c;還包含符號矩陣&#xff0c;以…

OpenCV進階操作:圖像的透視變換

文章目錄 前言一、什么是透視變換&#xff1f;二、透視變換的過程三、OpenCV透視變換核心函數四、文檔掃描校正&#xff08;代碼&#xff09;1、預處理2、定義輪廓點的排序函數3、定義透視變換函數4、讀取原圖并縮放5、輪廓檢測6、繪制最大輪廓7、對最大輪廓進行透視變換8、旋轉…

【python】基礎知識點100問

以下是Python基礎語法知識的30條要點整理,涵蓋數據類型、函數、控制結構等核心內容,結合最新資料歸納總結: 基礎30問 一、函數特性 函數多返回值 支持用逗號分隔返回多個值,自動打包為元組,接收時可解包到多個變量 def func(): return 1, "a" x, y = func()匿…

采用AI神經網絡降噪算法的通信語音降噪(ENC)模組性能測試和應用

采用AI降噪的語言通話環境抑制模組性能效果測試 隨著AI時代來臨.通話設備的環境噪音抑制也進入AI降噪算法時代. AI神經網絡降噪技術是一款革命性的語音處理技術&#xff0c;他突破了傳統單麥克風和雙麥克風降噪的局限性,利用采集的各種日常環境中的噪音樣本進行訓練學習.讓降噪…

openwrt目錄結構(部分)

1&#xff0c;openwrt 原始目錄需要注意的目錄 tools: 該目錄下存放著一些&#xff0c;編譯工程的自動化工具包和一些在編譯過程用到的命令包&#xff0c; 查看目錄下的Makefile&#xff0c;知道其會在編譯過程中將依賴包下載 例如&#xff1a; autoconf / lzma / mkimage/ …

RDB和AOF的區別

Redis提供兩種主要的持久化機制&#xff1a;RDB&#xff08;Redis Database&#xff09;和AOF&#xff08;Append Only File&#xff09;&#xff0c;它們在數據持久化方式、性能影響及恢復策略上各有特點。以下是兩者的對比分析及使用建議&#xff1a; RDB&#xff08;快照持久…

基于大模型的甲狀腺結節診療全流程預測與方案研究報告

目錄 一、引言 1.1 研究背景與目的 1.2 研究意義 1.3 國內外研究現狀 二、大模型預測原理與方法 2.1 相關大模型概述 2.2 數據收集與預處理 2.3 模型訓練與驗證 三、術前預測與評估 3.1 結節性質預測 3.1.1 良惡性判斷 3.1.2 與傳統診斷方法對比 3.2 手術風險預測…

逆向破解:x64dbg

文章目錄 一、CPU窗口1、反匯編窗口2、寄存器窗口3、棧地址窗口4、十六進制數據窗口5、堆棧參數解析窗口 二、常用快捷鍵三、字符串檢索功能四、調試功能1、上一步 一、CPU窗口 1、反匯編窗口 2、寄存器窗口 寄存器窗口用于顯示和解釋當前線程環境下CPU寄存器的各種狀態值和內…

免布線視頻樁如何重塑停車管理模式

傳統停車管理常因布線復雜、維護成本高而難以推廣&#xff0c;而“免布線視頻樁”通過無線設計、低功耗與高精度檢測&#xff0c;為城市停車提供高效解決方案。作為智慧城市建設的創新工具&#xff0c;免布線視頻樁以即裝即用、長效續航等特性&#xff0c;正在重塑停車管理模式…

【CTFer成長之路】舉足輕重的信息搜集

舉足輕重的信息搜集 信息搜集 常見的搜集 題目描述: 一共3部分flag docker-compose.yml version: 3.2services:web:image: registry.cn-hangzhou.aliyuncs.com/n1book/web-information-backk:latestports:- 80:80啟動方式 docker-compose up -d 題目Flag n1book{info_…

springboot3+vue3融合項目實戰-大事件文章管理系統-更新用戶密碼

大致分為這三步 首先在usercontroller中增加updatePwd方法 PatchMapping ("/updatePwd")public Result updatePwd(RequestBody Map<String,String> params){//1.校驗參數String oldPwd params.get("old_pwd");String newPwd params.get("n…

OpenCV進階操作:指紋驗證、識別

文章目錄 前言一、指紋驗證1、什么是指紋驗證2、流程步驟 二、使用步驟&#xff08;案例&#xff09;三、指紋識別&#xff08;案例&#xff09;1、這是我們要識別的指紋庫2、這是待識別的指紋圖3、代碼4、結果 總結 前言 指紋識別作為生物識別領域的核心技術之一&#xff0c;…

ECLIC中斷流程及實際應用 —— RISC-V中斷機制(二)

在長期的嵌入式開發實踐中&#xff0c;對中斷機制的理解始終停留在表面層次&#xff0c;特別當開發者長期局限于純軟件抽象層面時&#xff0c;對中斷機制的理解極易陷入"知其然而不知其所以然"的困境&#xff0c;這種認知的局限更為明顯&#xff1b;隨著工作需要不斷…

計算機網絡-LDP標簽發布與管理

前面學習了LDP建立鄰居&#xff0c;建立會話&#xff0c;今天來學習在MPLS中的標簽發布與管理。 在MPLS網絡中&#xff0c;下游LSR決定標簽和FEC的綁定關系&#xff0c;并將這種綁定關系發布給上游LSR。LDP通過發送標簽請求和標簽映射消息&#xff0c;在LDP對等體之間通告FEC和…

Go語言運算符詳解

文章目錄 1. 算術運算符2. 關系運算符3. 邏輯運算符4. 位運算符5. 賦值運算符6. 其他運算符運算符優先級注意事項 Go語言提供了與其他語言類似的運算符&#xff0c;包括算術運算符、關系運算符、邏輯運算符、位運算符、賦值運算符等。這些運算符即可滿足基本的運算需求。 1. 算…

Selenium模擬人類行為,操作網頁的方法(全)

看到有朋友評論問&#xff0c;用selenium怎么模仿人類行為&#xff0c;去操作網頁的頁面呢&#xff1f; 我想了想&#xff0c;這確實是一個很大的點&#xff0c;不應該是一段代碼能解決的&#xff0c; 就像是,如果讓程序模擬人類的行為。例如模擬人類買菜&#xff0c;做飯&am…

RabbitMQ的工作隊列模式和路由模式有什么區別?

RabbitMQ 的工作隊列模式&#xff08;Work Queues&#xff09;和路由模式&#xff08;Routing&#xff09;是兩種不同的消息傳遞模式&#xff0c;主要區別在于消息的分發邏輯和使用場景。以下是它們的核心差異&#xff1a; 1. 工作隊列模式&#xff08;Work Queues&#xff09…

牛客練習賽138(首篇萬字題解???)

賽時成績如下&#xff1a; 1. 小s的簽到題 小s拿到了一個比賽榜單&#xff0c;他要用最快的速度找到簽到題&#xff0c;但是小s腦子還是有點暈&#xff0c;請你幫幫小s&#xff0c;助力他找到簽到題。 比賽榜單是一個 2 行 n 列的表格&#xff1a; 第一行是 n 個大寫字母&#…