// 解法1:
// 先判断某个数组是否是空,是的话交集就是[];
// 判断哪个数组的长度比较小,小的数组来遍历
// 遍历的过程中,如果发现相等,就存起来,并且删除长数组对应的元素
/**
* @param {number[]} nums
* @return {number}
* /**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function(nums1, nums2) {
if( nums1.length === 0 || nums2.length === 0 ) return [];
if (nums1.length < nums2.length) [nums1, nums2] = [nums2, nums1];
for(let i = 0; i< nums1.length; i++){
let temp = nums1[i];
if(nums2.includes(nums1[i])) {
result.push(nums1[i])
let index = getIndex(nums2, nums1[i]);
nums2.splice(index, 1);
}
}
return result;
};
function getIndex(arr, num){
for(let i = 0; i< arr.length; i++){
if(arr[i] === num) {
return i;
}
}
return -1;
}
*/
// 解法2:
// 其实思路跟上面的差不多,但是就没有比较长短,而且用indexOf直接获得数组下标
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function(nums1, nums2) {
let result = [];
for(let i = 0; i< nums1.length; i++){
let temp = nums1[i];
if(nums2.indexOf(nums1[i]) !== -1) {
let index = nums2.indexOf(nums1[i]);
result.push(nums1[i])
nums2.splice(index, 1);
}
}
return result;
};
// 解法3: 使用指针
// 将两个数组进行排序,并使用两个指针
// while循环,在内部循环时:
// 如果两个相等,则存储起来,并且两个指针都向前移动一位;
// 如果不相等,因为大元素可能在小元素数组里存在,但是小元素在大元素所在数组肯定不存在
// 所以如果nums1[p1] < nums2[p2], 则p1向前移动一位;
// 否则p2移动一位
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function(nums1, nums2) {
if( nums1.length === 0 || nums2.length === 0 ) return [];
let p1 = 0;
let p2 = 0;
let result = [];
nums1.sort();
nums2.sort();
while(p1 < nums1.length && p2 < nums2.length){
if(nums1[p1] == nums2[p2]) {
result.push(nums1[p1])
p1++
p2++
} else if(nums1[p1] < nums2[p2]) {
p1++
} else {
p2++
}
}
return result;
};