class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
if(nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0){
return new int[0];
}
Set<Integer> set1 = new HashSet<>();
Set<Integer> set2 = new HashSet<>();
//遍历nums1
//将num1中的元素全部存储进set1中
for(int i : nums1){
set1.add(i);
}
//遍历nums2
for(int i : nums2){
//如果nums2中的元素存在set1中
//将其存储进set2
if(set1.contains(i)){
set2.add(i);
}
}
//new一个新的数组
int[] setArr = new int[set2.size()];
//初始化新数组的下标index
int index = 0;
//遍历set2
//将set2里的元素存储进新的数组
for(int i : set2){
setArr[index++] = i;
}
//返回该数组
return setArr;
}
}
解题思路:
- 先将两个数组排序, 指针
i
遍历nums1
, 指针j
遍历nums2
- 如果
nums1[i] < nums2[j]
, 将指针i右移
再比较nums1[i]
和nums2[j]
的大小
如果nums1[i] > nums2[j]
, 将指针j
右移
再比较nums1[i]
和nums2[j]
的大小
重复上述操作直到nums1[i] = nums2[j
] - 那么将
num1[i]
存储进数组arr
, 同时i++
,j++
,k++
- 最后返回复制的数组
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int length1 = nums1.length, length2 = nums2.length;
int[] arr = new int[nums1.length];
int i = 0, j = 0, k = 0;
while(i < length1 && j < length2){
if(nums1[i] < nums2[j]){
i++;
}else if(nums1[i] > nums2[j]){
j++;
}else{
arr[k] = nums1[i];
i++;
j++;
k++;
}
}
return Arrays.copyOfRange(arr, 0, k);
}
}
Arrays.copyOfRange()
方法:
Arrays.copyOfRange(T[] arr, int from, int to)
将一个数组arr
,从下标from
开始复制,复制到上标to
,生成一个新的数组
注意: 是左闭右开区间, 即包括下标from
, 不包括上标to