题目:
给出两个数组,写出一个方法求出它们的交集
例1:
输入: nums1 = [1, 2, 2, 1], nums2 = [2, 2],
输出: [2].
例2:
输入: nums1 = [1, 2], nums2 = [2],
输出: [2].
挑战
可以用三种不同的方法实现吗?
注意事项
-结果中的每个元素必须是唯一的。
-结果可以是任意顺序的。
二分查找方法:
public int[] intersection(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
HashSet<Integer> result_set = null;
if (nums1.length > nums2.length) {
result_set = inter_set(nums2, nums1);
} else {
result_set = inter_set(nums1, nums2);
}
int[] result = new int[result_set.size()];
int index = 0;
for (int key : result_set) {
result[index++] = key;
}
}
public Boolean bineary_search(int[] nums, int key) {
int begin = 0;
int end = nums.length - 1;
while (begin < end) {
int middle = (begin + end) / 2;
Log.e(TAG,"middle "+middle+"");
if (nums[middle] == key) {
return true;
}
else if (nums[middle] > key) {
end = middle - 1;
}
else if (nums[middle] < key) {
begin = middle + 1;
}
}
if (nums[begin] == key) {
return true;
}
if ( end!=-1 && nums[end] == key) {
return true;
}
return false;
}
public HashSet<Integer> inter_set(int[] small, int[] big) {
HashSet<Integer> result = new HashSet<Integer>();
for (int i = 0; i < small.length; i++) {
if (i > 0 && small[i] == small[i - 1]) {
continue;
}
if (result.contains(small[i])) {
continue;
}
if (bineary_search(big, small[i])) {
result.add(small[i]);
}
}
return result;
}
方法二:
public class Solution {
/**
* @param nums1: an integer array
* @param nums2: an integer array
* @return: an integer array
*/
public int[] intersection(int[] nums1, int[] nums2) {
// write your code here
int a = 0;
int [] in_result ;
HashSet<Integer> set = new HashSet<Integer>();
HashSet<Integer> set_result = new HashSet<Integer>();
if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0 ) {
in_result =new int[set_result.size()];
return in_result;
}
for (int i = 0;i < nums1.length;i++) {
set.add(nums1[i]);
}
for (int j = 0;j < nums2.length;j++) {
if (set.contains(nums2[j]) && !set_result.contains(nums2[j])) {
set_result.add(nums2[j]);
}
}
in_result =new int[set_result.size()];
for (int newList : set_result) {
in_result[a++] = newList;
}
return in_result;
}
}
第三种方法:
目前想到的是两个for循环。在这里就不写了。