5.15 哈希表合集—349.兩個數組的交集
給定兩個數組 nums1
和 nums2
,返回 它們的 交集 。輸出結果中的每個元素一定是 唯一 的。我們可以 不考慮輸出結果的順序 。
示例 1:
輸入:nums1 = [1,2,2,1], nums2 = [2,2]
輸出:[2]
示例 2:
輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出:[9,4]
解釋:[4,9] 也是可通過的
我的思路:
返回交集
nums1 = [1,2,2,1], nums2 = [2,2]
map [{1 , 1} , { 2 , 2}]
map.has
解決問題:去重問題 =>set
我的代碼:
function intersection(nums1: number[], nums2: number[]): number[] {// 存儲的setlet set = new Set();let set2 = new Set();let ans = [];let i = 0 ; // 遍歷數組當set當中for(let i = 0 ; i < nums1.length ; i++){set.add(nums1[i]);}for(let i = 0 ; i < nums2.length ; i++){set2.add(nums2[i]);}// 遍歷set2判斷set2的值set1是否有set2.forEach((item) => {if(set.has(item)){ans[i] = item;i++;}})return ans;
};
雖然我的代碼可以成功解答,但是從時間來看耗費的時長很大,而且耗費的空間也很大。
看了一下其他人的代碼對我的代碼進行了更新迭代:
ts語法+答案數組最開始為set后面轉化為數組
let resSet : Set<number> = new Set(nums1);//生成有nuns1的數字且不相同的setlet ansSet : Set<number> = new Set();for( let i of nums2){if(resSet.has(i)){ansSet.add(i);}}return Array.from(ansSet);
注意!
ts聲明的方式:
let resSet : Set<number> = new Set(nums1);
轉化為數組的方式:
Array.from(ansSet);
總結:本道題考的是對set的敏感度,我們知道set最大的優點就是不含重復的值,這對于本道題目有大大滴好處,先初始化一個對比set,后nums2是否在set中,在處理nums2進答案數組的時候,也是為了去重,我們事先將答案數組轉化為set,后轉化為數組的。
- new Set() : 創建一個新的 Set 對象。
- add(value) : 添加一個指定的值到 Set 對象中。
- delete(value) : 從 Set 對象中刪除一個指定的值。
- has(value) : 判斷 Set 對象中是否包含一個指定的值。
- clear() : 清除 Set 對象中的所有元素。
- forEach(callback[, thisArg]) : 對 Set 對象中的每一個值應用一個回調函數。
- values() / keys() : 返回一個新的迭代器對象,包含 Set 對象中的所有值(因為 Set 對象中的值是唯一的,所以 keys 和 values 返回的結果相同)。
- entries() : 返回一個新的迭代器對象,包含 Set 對象中的所有成員的鍵值對數組。
- size : 返回 Set 對象中的值的數量。