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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

LeetCode——350. 两个数组的交集 II

發布時間:2025/3/11 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode——350. 两个数组的交集 II 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述:

給定兩個數組,編寫一個函數來計算它們的交集。

示例 1: 輸入:nums1 = [1,2,2,1], nums2 = [2,2] 輸出:[2,2] 示例 2: 輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 輸出:[4,9]

說明:
輸出結果中每個元素出現的次數,應與元素在兩個數組中出現次數的最小值一致。
我們可以不考慮輸出結果的順序。

這個是我自己一開始寫出來的算法,有一點繁瑣,但是理解并不困,使用了排序以及鏈表

public int[] intersect(int[] nums1, int[] nums2) {ArrayList<Integer> list = new ArrayList<>();ArrayList<Integer> nums2list = new ArrayList<>();//先將它們各自進行升序排序Arrays.sort(nums1);Arrays.sort(nums2);//排除掉一定沒有交集的情況,需要考慮到數組為空時數組下標越界異常if(nums1.length==0 || nums2.length==0)return new int[0];else if(nums1[nums1.length-1]<nums2[0] || nums1[0]>nums2[nums2.length-1]){return new int[0];}//接下來是需要正常比較的情況for (int m : nums2) {nums2list.add(m);}//nums2list.forEach(System.out::println);for (int i : nums1) {for (Integer j : nums2list) {if(i==j){list.add(i);nums2list.remove(j);//刪除之后就找不到下一個了break;}}}int[] res = new int[list.size()];for (int i = 0; i < list.size(); i++) {res[i]=list.get(i);}//測試用for (int i : res) {System.out.println(i);}return res;}

然后我在力扣評論區卡拿到有位大佬總結出來好幾種

class Solution {/*** 使用集合實現*/public int[] intersect_1(int[] nums1, int[] nums2) {List<Integer> list1 = new ArrayList<>();for (int num : nums1) {list1.add(num);}List<Integer> list2 = new ArrayList<>();for (int num : nums2) {if (list1.contains(num)) {list2.add(num);// 從 list1 除去已匹配的數值list1.remove(Integer.valueOf(num));}}int[] res = new int[list2.size()];int i = 0;for (int num : list2) {res[i++] = num;}return res;}/*** 使用集合的實現*/public int[] intersect_2(int[] nums1, int[] nums2) {List<Integer> list1 = Arrays.stream(nums1).boxed().collect(Collectors.toList());List<Integer> list2 = Arrays.stream(nums2).boxed().filter(num -> {if (list1.contains(num)) {list1.remove(num);return true;}return false;}).collect(Collectors.toList());int[] res = new int[list2.size()];for (int i = 0; i < list2.size(); i++) {res[i] = list2.get(i);}return res;}/*** 使用映射實現*/public int[] intersect_3(int[] nums1, int[] nums2) {Map<Integer, Integer> map = new HashMap<>(nums1.length);// 將 nums1 出現的數值及頻次放入映射中for (int num : nums1) {Integer count = map.get(num);if (count == null) {map.put(num, 1);} else {map.put(num, ++count);}}List<Integer> list = new ArrayList<>();for (int num : nums2) {// 獲取映射中該數值出現的頻次Integer count = map.get(num);if (count != null && count != 0) {list.add(num);// 注意每次匹配后,該數值的頻次需要減 1(nums1 和 nums2 匹配的數值的頻次要相同)map.put(num, --count);}}int[] res = new int[list.size()];for (int i = 0; i < list.size(); i++) {res[i] = list.get(i);}return res;}/*** 排序預處理*/public int[] intersect(int[] nums1, int[] nums2) {Arrays.sort(nums1);Arrays.sort(nums2);List<Integer> list = new ArrayList<>();for (int i = 0, j = 0; i < nums1.length && j < nums2.length; ) {if (nums1[i] < nums2[j]) {i++;} else if (nums1[i] > nums2[j]) {j++;} else {list.add(nums1[i]);i++;j++;}}int[] res = new int[list.size()];for (int i = 0; i < list.size(); i++) {res[i] = list.get(i);}return res;} }

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。