image.png

方法一:暴力枚举

  1. function twoSum(nums: number[], target: number): number[] {
  2. for(let i = 0; i < nums.length - 1; i++) {
  3. for (let j = i + 1; j < nums.length; j++) {
  4. if (nums[i] + nums[j] === target) {
  5. return [i, j]
  6. }
  7. }
  8. }
  9. return []
  10. };

复杂度分析:

  • 时间复杂度分析:1. 两数之和 - 图2
  • 空间复杂度分析:1. 两数之和 - 图3

方法二:哈希表

暴力枚举的方法时间复杂度之所以高,主要原因是在查找 nums[i] + nums[j] === target 的时候时间复杂度高。当使用 Map 的时候,则可以将这个查找的过程从时间复杂度 1. 两数之和 - 图4 降到 1. 两数之和 - 图5

  1. function twoSum(nums: number[], target: number): number[] {
  2. const map = new Map()
  3. for(let i = 0; i < nums.length; i++) {
  4. // 等价于暴力枚举中 nums[i] + nums[j] === target 的过程
  5. // 但时间复杂度从 O(n) 降到 O(1)
  6. const diff = target - nums[i]
  7. if (map.has(diff)) {
  8. return [map.get(diff), i]
  9. }
  10. map.set(nums[i], i);
  11. }
  12. return []
  13. };

复杂度分析:

  • 时间复杂度分析:1. 两数之和 - 图6
  • 空间复杂度分析:1. 两数之和 - 图7