打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
527,两个数组的交集 II

Doing things change things, no doing things, these things are exactly as they were. 

行动才能改变,没有行动,一切也会原封不动。

问题描述



给定两个数组,编写一个函数来计算它们的交集

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]

输出:[2,2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]

输出:[4,9]

说明:

  • 输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。

  • 我们可以不考虑输出结果的顺序。

双指针解决



先对两个数组进行排序,然后使用两个指针,分别指向两个数组开始的位置。

  • 如果两个指针指向的值相同,说明这个值是他们的交集,就把这个值加入到集合list中,然后两个指针在分别往后移一步。

  • 如果两个指针指向的值不同,那么指向的值相对小的往后移一步,相对大的先不动,然后再比较

一直重复上面的操作,直到其中一个指针不能再移动为止,最后再把集合list转化为数组即可。来看下视频

在来看下代码

 1public int[] intersect(int[] nums1, int[] nums2) {
2    // 先对两个数组进行排序
3    Arrays.sort(nums1);
4    Arrays.sort(nums2);
5    int i = 0;
6    int j = 0;
7    List<Integer> list = new ArrayList<>();
8    while (i < nums1.length && j < nums2.length) {
9        if (nums1[i] < nums2[j]) {
10            // 如果i指向的值小于j指向的值,,说明i指向
11            // 的值小了,i往后移一步
12            i++;
13        } else if (nums1[i] > nums2[j]) {
14            // 如果i指向的值大于j指向的值,说明j指向的值
15            // 小了,j往后移一步
16            j++;
17        } else {
18            // 如果i和j指向的值相同,说明这两个值是重复的,
19            // 把他加入到集合list中,然后i和j同时都往后移一步
20            list.add(nums1[i]);
21            i++;
22            j++;
23        }
24    }
25    //把list转化为数组
26    int index = 0;
27    int[] res = new int[list.size()];
28    for (int k = 0; k < list.size(); k++) {
29        res[index++] = list.get(k);
30    }
31    return res;
32}

使用map解决



还可以使用map来解决,具体操作如下

  • 遍历nums1中的所有元素,把它存放到map中,其中key就是nums1中的元素,value就是这个元素在数组nums1中出现的次数。

  • 遍历nums2中的所有元素,查看map中是否包含nums2的元素,如果包含,就把当前值加入到集合list中,然后对应的value要减1。

最后再把集合list转化为数组即可,代码如下

 1public int[] intersect(int[] nums1, int[] nums2) {
2    HashMap<Integer, Integer> map = new HashMap<>();
3    ArrayList<Integer> list = new ArrayList<>();
4
5    //先把数组nums1的所有元素都存放到map中,其中key是数组中
6    //的元素,value是这个元素出现在数组中的次数
7    for (int i = 0; i < nums1.length; i++) {
8        map.put(nums1[i], map.getOrDefault(nums1[i], 0) + 1);
9    }
10
11    //然后再遍历nums2数组,查看map中是否包含nums2的元素,如果包含,
12    //就把当前值加入到集合list中,然后再把对应的value值减1。
13    for (int i = 0; i < nums2.length; i++) {
14        if (map.getOrDefault(nums2[i], 0) > 0) {
15            list.add(nums2[i]);
16            map.put(nums2[i], map.get(nums2[i]) - 1);
17        }
18    }
19
20    //把集合list转化为数组
21    int[] res = new int[list.size()];
22    for (int i = 0; i < list.size(); i++) {
23        res[i] = list.get(i);
24    }
25    return res;
26}

516,贪心算法解按要求补齐数组

509,数组中的第K个最大元素

504,旋转数组的3种解决方式

475,有效的山脉数组

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
用Python(Java)分别:求两个数组的交集
【算法千题案例】⚡️每日LeetCode打卡⚡️——53.两个数组的交集 II
三数之和,程序员才懂的 Three Sum !
查找数组中未出现的数
编号349:两个数组的交集
LeetCode 15. 三数之和(中等)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服