349. 两个数组的交集https://leetcode.cn/problems/intersection-of-two-arrays/
难度简单569
给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 解释:[4,9] 也是可通过的
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
通过次数319,065提交次数429,264
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
// 排序+二分
// 时间复杂度:采用冒泡排序,最好时间复杂度是O(n) 排序排大的数组
// 二分查找x次,时间复杂度为O(logn) x以小的数组为准
// 假设nums1为长的数组
if(nums1.length>nums2.length)
{
int [] temp = nums2;
nums2 = nums1;
nums1 = temp;
}
int len1 = nums1.length;
int len2 = nums2.length;
//冒泡排序
int flag = 0;
for(int i=1;i<len1;i++)
{
flag = 0;
for(int j=0;j<len1-i;j++)
{
if(nums1[j]>nums1[j+1])
{
int temp = nums1[j];
nums1[j] = nums1[j+1];
nums1[j+1] = temp;
flag = 1;
}
}
if(flag==0) break;
}
HashSet<Integer> list2 = new HashSet<Integer>();
for(int i=0;i<len2;i++)
{
list2.add(nums2[i]);
}
List<Integer> ans = new ArrayList<Integer>();
//二分查找:
Iterator it = list2.iterator();
while(it.hasNext())
{
int target=(int)it.next(); //取出元素
int start = 0;
int end = len1-1;
int mid;
while(start<=end)
{
mid = (end-start)/2+start;
if(target==nums1[mid])
{
ans.add(target);
break;
}
else if(target>nums1[mid]) start = mid+1;
else end = mid-1;
}
}
return ans.stream() .mapToInt(Integer::intValue) .toArray();
}
}