题目描述
题干:
给定两个数组,编写一个函数来计算它们的交集。
示例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方法的效率高些
如果文章存在问题或者有更好的题解,欢迎在评论区斧正和评论,各自努力,你我最高处见