仅用于学习记录
题目
图片:
题解
方法一:排序+双指针
这个方法还是很清晰明了的哦。
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
//对两个数组进行排序,Arrays.sort()默认为升序
Arrays.sort(nums1);
Arrays.sort(nums2);
//为下边的双指针做铺垫
int a=0,b=0,c=0;
//设置一个新数组,求交集的结果就存在里边哦
//数组长度肯定不超过两个数组最短的那个
int[] nums3 = new int[Math.min(nums1.length,nums2.length)];
//循环是遍历两个数组,如果有一个遍历完就结束循环
while(a<nums1.length&&b<nums2.length){
//比较大小,谁小就后移一位它的指针,因为排过序了,所以不会有遗漏情况
if(nums1[a]>nums2[b]){
b++;
}
else if(nums1[a]<nums2[b]){
a++;
}
//如果相等那就是我们要找的交集啦,就让nums3的指针后移
//进而让nums1,nums2的指针都后移,进而找下一个交集元素
else{
nums3[c]=nums1[a];
a++;
b++;
c++;
}
}
//Arrays.copyOfRange(int[] original, int from, int to)
//就是将指定数组的指定范围放到新数组里,从0到c
return Arrays.copyOfRange(nums3,0,c);
}
}
时间复杂度:O(mlog m+nlog n)
空间复杂度:O(min(m,n))
方法二:哈希表
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表
上源百度,不明其意,思索万千,逐渐自闭。
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
//将数组长度短的放在前面
if(nums1.length>nums2.length){
return intersect(nums2,nums1);
}
//创建一个哈希表,第一个参数(此为String) 是对"键"的数据类型的限制,第二个参数是对"值"的数据类型的限制,这里用的都是intersect的类
//这里Map里面的变量必须是泛型
Map<Integer , Integer> map = new HashMap<Integer , Integer>();
//这个循环是1.5开始的写法
//for(循环变量类型 循环变量名称:要被遍历的对象)
//遍历第一个数组,记录每个元素出现的个数并存到哈希表中
for(int num : nums1){
//第一次是遍历第一个数组,将其所有的数都存到里边并且计数
int count = map.getOrDefault(num,0)+1;
//将获取 Map 集合的所有键名,并存放在一个 Set 集合对象中
//put(K key,V value) key是要保存到Map集合中的键名,value是要保存到Map集合中对应键名的键值对象
map.put(num , count);
}
int[] nums3 = new int[nums1.length];
int c=0;
//遍历第二个数组,在哈希表中大于0则记录并删除
for(int num : nums2){
int count = map.getOrDefault(num,0);
if(count > 0){
nums3[c++]=num;
count--;
if(count > 0){
map.put(num,count);
}
else {
//就像它的名字一样,移除
map.remove(num);
}
}
}
//同上
return Arrays.copyOfRange(nums3,0,c);
}
}