image.png

方法一:使用交集

交集可以直接使用 Set 数据结构:

  1. function intersection(nums1: number[], nums2: number[]): number[] {
  2. const set1 = new Set(nums1)
  3. const result: number[] = []
  4. nums2.forEach(num => {
  5. if (set1.has(num)) {
  6. result.push(num)
  7. // 避免结果重复,因此将匹配过的数字从 set1 中删除
  8. set1.delete(num)
  9. }
  10. })
  11. return result
  12. };

方法二:排序+双指针

如果两个数组是有序的,就可以使用双指针的方法来得到交集。首先两个指针分别指向两个数组的头部,移动较小值的指针。当两个数字相同的时候,则将数字记录到结果中。但是需要注意的是需要与结果末尾的数字进行判断,来查看数字是否已经存在于结果中了。由于数组是排序过的,所以添加到结果中的数字必然也是排序的。

  1. var intersection = function(nums1, nums2) {
  2. nums1.sort((a, b) => a - b);
  3. nums2.sort((a, b) => a - b);
  4. let index1 = 0;
  5. let index2 = 0;
  6. const result = [];
  7. while(index1 < nums1.length && index2 < nums2.length) {
  8. const num1 = nums1[index1]
  9. const num2 = nums2[index2]
  10. if (num1 === num2) {
  11. // 结果为空的时候,无需考虑结果重复的情况,直接将数字添加到结果中
  12. // 如果结果不为空,则需要考虑一下结果中是否已经包含了相同的数字
  13. if (result.length === 0 || result[result.length - 1] !== num1) {
  14. result.push(num1)
  15. }
  16. index1++
  17. index2++
  18. } else if (num1 <num2) {
  19. index1++
  20. } else {
  21. index2++
  22. }
  23. }
  24. return result
  25. };