leetcode刷题-350两个数组的交集2

126 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

leetcode350-两个数组的交集

前文

本文为菜鸟的刷题记录,仅用作笔记使用,并非最佳解决方案。

题目信息

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

  • 示例 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 双指针

本方案的思路主要是通过两个指针对数组进行同步遍历。首先对两个数组进行排序,排序后就可以直接从小到大进行遍历。两个数组在循环中同时向前遍历推进,由数组指针分别表示当前的遍历位置。当两个数组当前的数据不相等时,则对较小的指针向前推进。如果两个数组的数据相等,则将其记录在结果数组中作为二者的交集。此方案可以显著降低对于两个数组的循环次数。 代码如下:

int length1 = nums1.length;
int length2 = nums2.length;
int length = length1 > length2 ? length2 : length1;
int[] result = new int[length];
int index = 0;
int index1 = 0;
int index2 = 0;
Arrays.sort(nums1);
Arrays.sort(nums2);
while(index1 < length1 && index2 < length2){
    if(nums1[index1] < nums2[index2]){
        index1++;
    }else if(nums1[index1] > nums2[index2]){
        index2++;
    }else{
        result[index] = nums1[index1];
        index1++;
        index2++;
        index++;
    }
}

return Arrays.copyOfRange(result,0,index);

复杂度分析

  • 时间复杂度 o(m+n)
  • 空间复杂度 o(m+n)

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。