日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode_349. 两个数组的交集

發(fā)布時間:2025/3/21 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode_349. 两个数组的交集 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 題目
  • 分析
  • Code
    • 方式一 :Set + 數(shù)組
    • 方式二: 兩個 set
    • 方式三: 內(nèi)置函數(shù)


題目

https://leetcode-cn.com/problems/intersection-of-two-arrays/


分析

幼稚的方法是根據(jù)第一個數(shù)組 nums1 迭代并檢查每個值是否存在在 nums2 內(nèi)。如果存在將值添加到輸出。這樣的方法會導O(n×m) 的時間復雜性,其中 n 和 m 是數(shù)組的長度。

為了在線性時間內(nèi)解決這個問題,我們使用集合 set,在 O(1) 時間復雜度實現(xiàn)操作。

其思想是將兩個數(shù)組轉換為集合 set,然后迭代較小的集合檢查是否存在在較大集合中。平均情況下,這種方法的時間復雜度為 O(n+m)


Code

方式一 :Set + 數(shù)組

import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.TreeSet;/*** * * @ClassName: Solution* * @Description: 給定兩個數(shù)組,編寫一個函數(shù)來計算它們的交集。* * 輸出結果中的每個元素一定是唯一的。 我們可以不考慮輸出結果的順序。* @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 元素不重復 ,存放數(shù)組1Set<Integer> set = new TreeSet<>();for (int num : nums1) {set.add(num);}// 遍歷數(shù)組2,判斷是數(shù)組2中的每個元素是否在數(shù)組1中// 存在則加入到targetList// 同時為了防止數(shù)組2有重復的數(shù)據(jù),導致targetList重復,所以要移除set中的元素,防止重復for (int num2 : nums2) {if (set.contains(num2)) {targetList.add(num2);set.remove(num2);}}// list轉數(shù)組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) {// 數(shù)組1 入setHashSet<Integer> set1 = new HashSet<Integer>();for (Integer n : nums1) {set1.add(n);}// 數(shù)組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: 迭代較小的集合檢查是否存在在較大集合中 減少遍歷次數(shù)* * @param smallSet* @param largeSet* * @return: int[]*/private int[] setIntersection(HashSet<Integer> smallSet, HashSet<Integer> largeSet) {int[] target = new int[smallSet.size()]; // 先開辟一個小的內(nèi)存區(qū)域int idx = 0;// 下面的這種遍歷,沒有下標,定義一個索引下標for (int num : smallSet) {// 迭代較小的集合檢查是否存在在較大集合中 減少遍歷次數(shù)if (largeSet.contains(num)) {// target[idx] = num;// idx++;// 上面兩行可以直接寫成如下target[idx++] = num;}}return Arrays.copyOf(target, idx); // 返回idx長度的數(shù)組,避免出現(xiàn)多余的0}

復雜度分析

  • 時間復雜度:O(m+n),其中 n 和 m 是數(shù)組的長度。 O(n) 的時間用于轉換 nums1 在集合中, O(m) 的時間用于轉換 nums2 到集合中,并且平均情況下,集合的操作為 O(1)
  • 空間復雜度:O(m+n),最壞的情況是數(shù)組中的所有元素都不同。

方式三: 內(nèi)置函數(shù)

內(nèi)置的函數(shù)在一般情況下的時間復雜度是 O(n+m) 且時間復雜度最壞的情況是 O(n×m) ,在 Java 提供了 retainAll() 函數(shù).

public int[] intersection(int[] nums1, int[] nums2) {// 數(shù)組1 入setHashSet<Integer> set1 = new HashSet<Integer>();for (Integer n : nums1)set1.add(n);// 數(shù)組2 入setHashSet<Integer> set2 = new HashSet<Integer>();for (Integer n : nums2)set2.add(n);// 內(nèi)置函數(shù)set1.retainAll(set2);// set轉數(shù)組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),當數(shù)組中的元素全部不一樣時。

總結

以上是生活随笔為你收集整理的LeetCode_349. 两个数组的交集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。