携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情
一 描述
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
示例 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 <= nums1.length, nums2.length <= 1000
- 0 <= nums1[i], nums2[i] <= 1000
进阶:
- 如果给定的数组已经排好序呢?你将如何优化你的算法?
- 如果 nums1 的大小比 nums2 小,哪种方法更优?
- 如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?
二 分析
采用Two Pointers(双指针)的思想。首先对两个数组进行排序
再用两个int变量i、j分别指向两个数组的下标
从0开始同时进行扫描,直到任意一个数组完成扫描,退出循环
循环过程中,若i、j指向的两个数组元素相同,则将其添加进结果数组中
否则,将指向较小元素的变量加一,即指向所在数组的下一个元素继续进行比较
循环往复,最终得到结果数组
三 答案
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int i=0,j=0;
int len=nums1.length;
if(nums2.length<nums1.length)
len=nums2.length;
int[] aux=new int[len];
int idx=0;
while(i<nums1.length && j<nums2.length)
{
if(nums1[i]==nums2[j])
{
aux[idx++]=nums1[i++];
j++;
}
else if(nums1[i]<nums2[j])
i++;
else
j++;
}
int[] output=new int[idx];
for(int k=0;k<idx;k++)
output[k]=aux[k];
return output;
}
}