两个数组的交集
给定两个数组 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;
int[] num = new int[n];
int i=0,j=0;
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);
}
}
|