1 題目地址
349. 兩個數組的交集 - 力扣(LeetCode)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] 也是可通過的?提示: * 1 <= nums1.length, nums2.length <= 1000 * 0 <= nums1[i], nums2[i] <= 1000https://leetcode.cn/problems/intersection-of-two-arrays/description/
2 題目說明
給定兩個數組?
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] 也是可通過的?
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
3 解題思路
方式一:使用HashSet
1、將數組nums1的數據放入到HashSet中
2、遍歷nums2中的數據是否存在HashSet中,存在在放入到另外一個HashSet中
方式二:使用哈希表(數組) 【題干中限制了nums1 nums2的長度、數值都小于等于1000】
如果題干沒有限制,其實是不太適合用哈希表實現的,而且如果哈希值比較少、特別分散、跨度非常大,使用數組就造成空間的極大浪費。
1、創建兩個數組nums1Array、nums2Array長度都為1001
????????????????(nums[i]=1000需要往nums1Array[1000]=1;數組長度設置成1000會報數組下標越界)
2、分別遍歷nums1,nums2,將數據分別放入到nums1Array、nums2Array;?nums1[i]的值映射成數組的index,出現的次數映射成value
3、判斷兩個數組nums1Array、nums2Array中的索引下標對應的value都大于0表示存在相同的數字。
4 代碼編寫
4.1 HashSet方式
class Solution {public int[] intersection(int[] nums1, int[] nums2) {Set<Integer> nums1Set = new HashSet<>();Set<Integer> resultSet = new HashSet<>();for (int i=0; i<nums1.length; i++) {nums1Set.add(nums1[i]);}for (int i=0; i<nums2.length; i++) {if (nums1Set.contains(nums2[i])) {resultSet.add(nums2[i]);}}return resultSet.stream().mapToInt(x->x).toArray();}
}

4.2 使用hash數組
?int[] nums1Array = new int[1001];
?int[] nums2Array = new int[1001];?
注意這塊長度如果設置成1000,會報數組下標越界,當數組中存在1000的時候,就需要往nums1Array[1000]=1
class Solution {public int[] intersection(int[] nums1, int[] nums2) {int[] nums1Array = new int[1001];int[] nums2Array = new int[1001];for (int i=0; i<nums1.length; i++) {nums1Array[nums1[i]]++; // 關鍵碼(索引)表示數據,關鍵值(數據)表示數量}for (int i=0; i<nums2.length; i++) {nums2Array[nums2[i]]++; // 關鍵碼(索引)表示數據,關鍵值(數據)表示數量}List<Integer> resultList = new ArrayList<>();for (int i=0; i<1001; i++) {if (nums1Array[i]>0 && nums2Array[i]>0) {resultList.add(i);}}return resultList.stream().mapToInt(Integer::intValue).toArray();}
}
?