Fork me on GitHub

leetcode_1-两数之和_javascript

题目

1.两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

思路

  • javascript 解法

  • 一开始看到这个下意识就想先排序,然后用两个变量记录下标,假设两个变量为x = 0y = arr.length - 1,那么arr[x],arr[y]就分别代表最小和最大的值了,这时候再进入循环判断,如果小于target,则 x += 1,若大于target,则y -= 1,直到相等之后就跳出循环。

  • 复杂度就是sort的nlogn,最后代码的运行时间在80ms,内存消耗36.8MB

代码


/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
  const copy = [];
  for(let k=0; k <= nums.length - 1; k++) {
    // 这边copy是要记录原来数字的下标,排序之后就会打乱
    // 又因为js中数组是引用类型,如果直接复制的话是浅拷贝是不行的,当然这样子也是浅拷贝,不过都是数字就无所谓了
      copy.push(nums[k]);
  }
  nums.sort((a, b) => {
      return a - b;
  });
  let i = 0, j = nums.length - 1;
  for (;;) {
      if (nums[i] + nums[j] === target) {
          break;
      }
      if (nums[i] + nums[j] < target) {
          i += 1;
      } else {
          j -= 1;
      }
  }
  let m = -1, n = -1, flag = 0;
  for (let k=0;k<nums.length;k++) {
      if (flag == 2) {
          break;
      }
      if (nums[i] === copy[k] && m === -1) {
          m = k;
          flag++;
      } else if (nums[j] === copy[k] && n === -1) {
          n = k;
          flag++;
      }

  }
  return [m, n];
};

注意点

  • JavaScript内置的sort方法对数字的排序是无效的,所以需要另外传进去一个函数来进行判断
posted @ 2020-07-15 16:03  azoux  阅读(131)  评论(0编辑  收藏  举报