LeetCode两个数组的交集

2023-11-11

两个数组的交集

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

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

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays

一开始想的是找两个数组中不同的元素,当两个数组中某一个在另一个数组中不存在时,就remove,但remove方法只在list集合中。
还有一种思路,两个for循环遍历,两个数组只要有相同的元素就拷贝到新数组中。
官方题解中还有一种采用排序加双指针的方法,就是先对数组元素进行排序,只需要Arrays.sort就好,然后i和j分别是两个数组的索引:
(1)当nums1【i】和nums2【j】相等时,写入新数组(这里要注意新数组还没有元素的时候),还有,nums1和nums2中很有可能有重复元素,即便相同位置元素相同,很有可能元素已经在num中,需要判断当前元素和num【index-1】是否相等,不相等就可以写入。
(2)当nums1【i】>nums2【j】时,由于是已经排好序的,所以让j++就好。
(3)同理nums1【i】<nums2【j】时,i++。

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        
        //排序
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int n = nums1.length+nums2.length;
        //最终的元素存储在num数组中
        int[] num = new int[n];
        //定义两个数组的索引
        int i=0,j=0;
        //定义num数组的索引
        int index=0;
        while((i<nums1.length)&&(j<nums2.length)){
            if(nums1[i]==nums2[j]){
                if(index==0||nums1[i]!=num[index-1])
                    num[index++] = nums1[i];
                i++;
                j++;
            }
            else if(nums1[i]>nums2[j])
                j++;
            else
                i++;
        }
        return Arrays.copyOfRange(num,0,index);

    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode两个数组的交集 的相关文章

随机推荐