输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]
思路:如果两者都是无序的可以采用哈希表。即统计两个数组较短的数组的每个字符重复的个数,然后遍历长数组,如果哈希表中存在则,将个数减1,然后将这个元素存到新的数组中,哈希表<元素,个数>;可以采用Arrays中的排序方法sort()将两个无序数组进行排序,然后采用双指针;
class Solution {
//无序采用哈希表
// public int[] intersect(int[] nums1, int[] nums2) {
// if(nums1.length>nums2.length){
// return intersect(nums2,nums1);
// }
// Map<Integer, Integer> map = new HashMap<Integer, Integer>();
// // Map<Integer, Integer> map = new HashMap<Integer, Integer>();
// for(int num1:nums1){
// if(map.containsKey(num1)){
// map.put(num1,map.get(num1)+1);
// }else{
// map.put(num1,1);
// }
// }
// int result[] = new int [nums1.length];
// int index =0;
// for(int num2:nums2){
// if(map.containsKey(num2)){
// if(map.get(num2)>0){
// result[index++] = num2;
// map.put(num2,map.get(num2)-1);
// }else{
// map.remove(num2);
// }
// }
// }
// return Arrays.copyOf(result,index);
// }
//有序
public int[] intersect(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int result[] = new int[Math.min(nums1.length,nums2.length)];
int index =0;
int index1=0;
int index2=0;
while(index1<nums1.length &&index2<nums2.length){
if(nums1[index1]<nums2[index2]){
index1++;
}else if(nums1[index1]>nums2[index2]){
index2++;
}else{
result[index++] = nums1[index1];
index1++;
index2++;
}
}
return Arrays.copyOfRange(result,0,index);
}
}