题目描述:
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]
说明:
- 输出结果中的每个元素一定是唯一的。
- 我们可以不考虑输出结果的顺序。
解题思路:
- 写一个工具类,可以在给定数组中查找是否有指定元素的存在。
- 创建一个新数组,用于存放两数组交集的元素,初始长度为两数组中较小数组的长度。
- 因为输出结果中的元素是唯一的,也就是不能重复。所以先将一个数组排序。
- 遍历排序后的数组中的每一个元素(如果该元素不唯一,则跳过此元素),查询每个元素在另一个数组中是否存在,如果存在,则将此元素存放进新数组中。
代码实现:
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
int m = nums1.length;
int n = nums2.length;
if (m < 1 || n < 1) {
return new int[]{};
}else if (m < 1 && n < 1) {
return nums1;
}
int num = m<n?m:n;
int[] arr = new int[num];
int k = 0;
int count = 0; //交集元素的个数
Arrays.sort(nums1);
if (ensureNumber(nums2,nums1[0])) {
arr[k++] = nums1[0];
count++;
}
for (int i = 1; i < m; i++) {
if (nums1[i] != nums1[i-1] && ensureNumber(nums2,nums1[i])) {
arr[k++] = nums1[i];
count++;
}
}
int[] result = new int[count];
for (int i = 0; i < result.length; i++) {
result[i] = arr[i];
}
return result;
}
/**
* 检查给定数组中是否有指定数值
* @param arr 给定数组
* @param value 给定数值
* @return 如果存在,返回true,否则返回false
*/
public boolean ensureNumber(int[] arr, int value) {
Arrays.sort(arr);
int l = 0;
int r = arr.length - 1;
while (l <= r) {
int mid = l + (r-l)/2;
if (arr[mid] > value) {
r = mid - 1;
}else if (arr[mid] < value) {
l = mid + 1;
}else {
return true;
}
}
return false;
}
}