【LeetCode】349. 兩個陣列的交集
阿新 • • 發佈:2021-07-24
349. 兩個陣列的交集
知識點:set; 雙指標
題目描述
給定兩個陣列,編寫一個函式來計算它們的交集。
示例
輸入:nums1 = [1,2,2,1], nums2 = [2,2]
輸出:[2]
輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
輸出:[9,4]
解法一:set
交集,這不就是說的重複嗎?果斷想到set;遍歷一個數組,把不重複的存入set,再遍歷另一個數組,如果set裡有,那就是一個交集,防止多算,把它移除,接著遍歷。
class Solution { public int[] intersection(int[] nums1, int[] nums2) { List<Integer> list = new ArrayList<>(); Set<Integer> set = new HashSet<>(); for(Integer i : nums1){ if(!set.contains(i)) set.add(i); } for(Integer i : nums2){ if(set.contains(i)){ set.remove(i); list.add(i); } } return list.stream().mapToInt(Integer::valueOf).toArray(); //要學會這個list<Integer>轉為int[];此外也可以這樣 //index = 0; //int[] arr = new int[list.size()]; //for(Integer i : list){ // arr[index++] = i; //} //return arr; } }
時間複雜度:O(N+M);
解法二:排序+雙指標
先將兩個陣列排序,這樣兩個陣列都是從小到大了,然後使用兩個指標同時遍歷這兩個陣列,如果兩個指標指的元素相等就是交集加入list,如果兩個指標指的值不等,則移動較小的元素,接著比較。直到有一個指標走到了頭。其實就是維持了一個從小到大的順序。這樣方便比較。
注意要比較新加入的值和已經加入的值是否相同;
class Solution { public int[] intersection(int[] nums1, int[] nums2) { Arrays.sort(nums1); Arrays.sort(nums2); int length1 = nums1.length, length2 = nums2.length; List<Integer> list = new ArrayList<>(); int index = 0, index1 = 0, index2 = 0; while (index1 < length1 && index2 < length2) { int num1 = nums1[index1], num2 = nums2[index2]; if (num1 == num2) { // 保證加入元素的唯一性 if (list.size() == 0 || num1 != list.get(list.size() - 1)) { list.add(num1); } index1++; index2++; } else if (num1 < num2) { index1++; } else { index2++; } } int[] arr = new int[list.size()]; for(Integer i : list){ arr[index++] = i; } return arr; } }