持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情
无惊无险又月中了,最近天气开始转凉,但是还是不能放松自己
两个数组的交集
该题出自力扣的349题 —— 两个数组的交集【简单题】
审题
给定两个数组
nums1
和nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
- 该题的题意并不难,因为是简单题,所以相对来说条件会宽松一点,顾名思义就是给出两个数组,找出两个数组的交集并且存储到一个数组内部返回
- 那么这道题的解法:利用排序+双指针
- 因为返回的是数组,但是并不知道最终可以有多少个交集,因此使用集合List,并且最终的时候利用stream流去汇总list转换成数组
- 先对两个数组进行排序,可以预见的是加入答案的数组的元素一定是递增的,为了保证加入元素的唯一性,我们需要额外记录变量
- 定义两个数组的当前下标,并且定义两个数组的长度变量
- while循环两个下标是否达到数组的长度,因为有一个超出长度,排序后的数组必定不再与前一个数组有交集
- 如果包含的话,直接下标 + 1,作为查重
- 判断是否大于或者小于,每次比较两个指针指向的两个数组中的数字,如果两个数字不相等,则将指向较小数字的指针右移一位,如果两个数字相等则加入list
编码
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
List<Integer> list = new ArrayList<>();
Arrays.sort(nums1);
Arrays.sort(nums2);
int len1 = nums1.length,len2 = nums2.length;
int index1 = 0,index2 = 0;
while (len1 != index1 && len2 != index2){
if (list.contains(nums1[index1])){
index1++;
continue;
}else if (list.contains(nums2[index2])){
index2++;
continue;
}
if (nums1[index1] > nums2[index2]){
index2++;
}else if (nums1[index1] < nums2[index2]){
index1++;
}else {
list.add(nums1[index1]);
index1++;
index2++;
}
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
}