码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2021-04-01 13:39:19      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:指针   数组   另一个   使用方法   耗资源   amp   ret   准备   双指针   

题目描述

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

示例1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]

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

题解思路

依稀记得两个数组的交集Ⅰ中好像是数组中的元素只出现一次,当时用哈希表很简单就得出结果

这次无非是数组中出现了重复元素,这次就用效率更好的双指针,当然哈希表也还是可以做的

双指针思路就是两个数组排序后同时从头遍历,相同的元素即可存放到新数组中,无非是定义新的空间有点消耗资源

而如果采用哈希表,和Ⅰ一样,也是先一个数组存入到哈希表中,在遍历另一个数组时,重复的元素值-1,最后值大于零的取出

这里因为哈希表和双指针的方法各有长短,一个时间复杂度低,一个空间复杂度底,这就要看实际情况了,这里给出双指针的代码供参考

正确代码

    public int[] intersect1(int[] nums1, int[] nums2) {
        //排序为遍历做准备
        Arrays.sort(nums1);
        Arrays.sort(nums2);

        int flag1 = 0, flag2 = 0, flag = 0;
        int len = 0;

        //尽量保证少定义新的空间
        int[] ans = new int[Math.min(nums1.length,nums2.length)];

        while (flag1 < nums1.length && flag2 < nums2.length) {
            if (nums1[flag1] == nums2[flag2]) {
                ans[flag] = nums1[flag1];
                flag++;
                flag1++;
                flag2++;
            }else if (nums1[flag1] < nums2[flag2]){
                flag1++;
            }else {
                flag2++;
            }
        }

        //将ans数组去零
        int[] newAnswer = new int[flag];
        System.arraycopy(ans,0,newAnswer,0,flag);
        return newAnswer;

        //return Arrays.copyOfRange(ans,0,flag);
    }

总结

双指针最后因为定义的ans数组中没有赋值的元素都默认为0,需要做去除零元素的操作

这里一共有两个方法,一个是System下的arraycopy()方法,还有就是Arrays下的copyOfRange()方法,都是定义新的数组存储

使用方法:
    arraycopy(原数组名称,原数组起始下标,目标数组名称,目标数组起始下标,截取长度)
    copyOfRange(原数组,开始的下标,截至的下标)

这里需要注意copyOfRange()方法中截至的下标是取不到的,自己尝试的是arraycopy方法的效率高些

如果文章存在问题或者有更好的题解,欢迎在评论区斧正和评论,各自努力,你我最高处见

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

标签:指针   数组   另一个   使用方法   耗资源   amp   ret   准备   双指针   

原文地址:https://www.cnblogs.com/bc-song/p/14604727.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!