这个题有收获啊。。。。
前面不说了,MAP之后各遍历一次就行。
SORT之后可以用2个PTR从最左边开始,能提前结束。
排序之后的思路:
遍历smaller array,看看每个元素在大的里面能不能找到,找的话返还位置,用的二分查找INDEX,找到直接在大的里面从头修改就行了。最后返还修改的部分。
public class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
if(nums1.length == 0 || nums2.length == 0) return new int[0];
Arrays.sort(nums1);
Arrays.sort(nums2);
int[] small;
int[] large;
if(nums1.length < nums2.length){
small = nums1;
large = nums2;
}else{
small = nums2;
large = nums1;
}
int left = 0;
int right = 0;
for(int i = 0; i < small.length; i++){
int firstIndex = binarySearch(large,right,small[i]);
if(firstIndex == -1) continue;
else{
large[left++] = large[firstIndex];
right = firstIndex+1;
}
}
return Arrays.copyOf(large,left);
}
public int binarySearch(int[] nums, int start, int target){
if(start >= nums.length) return -1;
int l = start;
int r = nums.length-1;
while(l <= r){
int M = nums[l] + (nums[r] - nums[l])/2;
if(M < target) l++;
else r--;
}
//System.out.println(l);
if(l >= 0 && l < nums.length && nums[l] == target) return l;
else return -1;
}
}
/*
[]
[]
[1,2,3,4,5,6,5,44,5,6,7,5,5,4,3,3,2,3,4,5,5,6,7]
[2,3,4,2,3,4,3,2,1,1,3,4,4,5,2,2,3,4,99]
*/
还是挺有意思的。。
有电面啦!!!!!!!!!!
加油啊!!!!