题目描述:
Given two arrays, write a function to compute their intersection.
Example:
Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2].
Note:
Each element in the result must be unique.
The result can be in any order.
思路一:
利用两个HashSet,时间复杂度为O(n)。
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> set = new HashSet<>();
HashSet<Integer> intersect = new HashSet<>();
for (int num1 : nums1)
set.add(num1);
for (int num2 : nums2)
if (set.contains(num2))
intersect.add(num2);
int[] res = new int[intersect.size()];
int i = 0;
for (Integer num : intersect)
res[i++] = num;
return res;
}
}
只用一个HashSet
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> set = new HashSet<>();
ArrayList<Integer> intersect = new ArrayList<>();
for (int num1 : nums1)
set.add(num1);
for (int num2 : nums2)
if (set.contains(num2))
{
intersect.add(num2);
set.remove(num2);
}
int[] res = new int[intersect.size()];
int i = 0;
for (Integer num : intersect)
res[i++] = num;
return res;
}
}
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> set = new HashSet<>();
for (int num1 : nums1)
set.add(num1);
int[] res = new int[set.size()];
int i = 0;
for (int num2 : nums2)
if (set.contains(num2))
{
res[i++] = num2;
set.remove(num2);
}
return Arrays.copyOfRange(res, 0, i);
}
}
思路二:
时间复杂度为O(nlogn)。
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> set = new HashSet<>();
Arrays.sort(nums1);
Arrays.sort(nums2);
int i = 0;
int j = 0;
while (i < nums1.length && j < nums2.length)
{
if (nums1[i] == nums2[j])
{
set.add(nums1[i]);
i++;
j++;
}
else if (nums1[i] > nums2[j])
j++;
else
i++;
}
int[] intersect = new int[set.size()];
int k = 0;
for (Integer num : set)
intersect[k++] = num;
return intersect;
}
}
思路三:
二分查找,时间复杂度为O(nlogn)。
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> set = new HashSet<>();
Arrays.sort(nums1);
for (int num2 : nums2)
if (binarySearch(nums1, num2))
set.add(num2);
int[] interset = new int[set.size()];
int i = 0;
for (Integer num : set)
interset[i++] = num;
return interset;
}
public boolean binarySearch(int[] num, int target)
{
int low = 0;
int high = num.length - 1;
while (low <= high)
{
int mid = (low + high) / 2;
if (target < num[mid])
high = mid - 1;
else if (target > num[mid])
low = mid + 1;
else
return true;
}
return false;
}
}