LeetCode_349. 两个数组的交集
生活随笔
收集整理的這篇文章主要介紹了
LeetCode_349. 两个数组的交集
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 題目
- 分析
- Code
- 方式一 :Set + 數組
- 方式二: 兩個 set
- 方式三: 內置函數
題目
https://leetcode-cn.com/problems/intersection-of-two-arrays/
分析
幼稚的方法是根據第一個數組 nums1 迭代并檢查每個值是否存在在 nums2 內。如果存在將值添加到輸出。這樣的方法會導O(n×m) 的時間復雜性,其中 n 和 m 是數組的長度。
為了在線性時間內解決這個問題,我們使用集合 set,在 O(1) 時間復雜度實現操作。
其思想是將兩個數組轉換為集合 set,然后迭代較小的集合檢查是否存在在較大集合中。平均情況下,這種方法的時間復雜度為 O(n+m)
Code
方式一 :Set + 數組
import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.TreeSet;/*** * * @ClassName: Solution* * @Description: 給定兩個數組,編寫一個函數來計算它們的交集。* * 輸出結果中的每個元素一定是唯一的。 我們可以不考慮輸出結果的順序。* @author: Mr.Yang* * @date: 2020年2月9日 下午3:39:28*/ public class Solution {public int[] intersection(int[] nums1, int[] nums2) {// 保存目標元素的集合List<Integer> targetList = new ArrayList<>();// set 元素不重復 ,存放數組1Set<Integer> set = new TreeSet<>();for (int num : nums1) {set.add(num);}// 遍歷數組2,判斷是數組2中的每個元素是否在數組1中// 存在則加入到targetList// 同時為了防止數組2有重復的數據,導致targetList重復,所以要移除set中的元素,防止重復for (int num2 : nums2) {if (set.contains(num2)) {targetList.add(num2);set.remove(num2);}}// list轉數組int[] target = new int[targetList.size()];for (int i = 0; i < target.length; i++) {target[i] = targetList.get(i);}return target;}public static void main(String[] args) {Solution solution = new Solution();int[] target = solution.intersection(new int[] { 1, 2, 2, 1 }, new int[] { 2, 2 });for (int i = 0; i < target.length; i++) {System.out.println(target[i] + ",");}} }方式二: 兩個 set
public int[] intersection3(int[] nums1, int[] nums2) {// 數組1 入setHashSet<Integer> set1 = new HashSet<Integer>();for (Integer n : nums1) {set1.add(n);}// 數組2 入setHashSet<Integer> set2 = new HashSet<Integer>();for (Integer n : nums2) {set2.add(n);}// 比較if (set1.size() < set2.size()) {return setIntersection(set1, set2);} else {return setIntersection(set2, set1);}}/*** * * @Title: setIntersection* * @Description: 迭代較小的集合檢查是否存在在較大集合中 減少遍歷次數* * @param smallSet* @param largeSet* * @return: int[]*/private int[] setIntersection(HashSet<Integer> smallSet, HashSet<Integer> largeSet) {int[] target = new int[smallSet.size()]; // 先開辟一個小的內存區域int idx = 0;// 下面的這種遍歷,沒有下標,定義一個索引下標for (int num : smallSet) {// 迭代較小的集合檢查是否存在在較大集合中 減少遍歷次數if (largeSet.contains(num)) {// target[idx] = num;// idx++;// 上面兩行可以直接寫成如下target[idx++] = num;}}return Arrays.copyOf(target, idx); // 返回idx長度的數組,避免出現多余的0}復雜度分析
- 時間復雜度:O(m+n),其中 n 和 m 是數組的長度。 O(n) 的時間用于轉換 nums1 在集合中, O(m) 的時間用于轉換 nums2 到集合中,并且平均情況下,集合的操作為 O(1)
- 空間復雜度:O(m+n),最壞的情況是數組中的所有元素都不同。
方式三: 內置函數
內置的函數在一般情況下的時間復雜度是 O(n+m) 且時間復雜度最壞的情況是 O(n×m) ,在 Java 提供了 retainAll() 函數.
public int[] intersection(int[] nums1, int[] nums2) {// 數組1 入setHashSet<Integer> set1 = new HashSet<Integer>();for (Integer n : nums1)set1.add(n);// 數組2 入setHashSet<Integer> set2 = new HashSet<Integer>();for (Integer n : nums2)set2.add(n);// 內置函數set1.retainAll(set2);// set轉數組int[] output = new int[set1.size()];int idx = 0;for (int s : set1)output[idx++] = s;return output;}復雜度分析
- 時間復雜度:一般情況下是 O(m+n),最壞情況下是 O(m×n)。
- 空間復雜度:最壞的情況是 O(m+n),當數組中的元素全部不一樣時。
總結
以上是生活随笔為你收集整理的LeetCode_349. 两个数组的交集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Algorithms_二叉树的层次遍历(
- 下一篇: Redis进阶-核心数据结构进阶实战