zoukankan      html  css  js  c++  java
  • 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方法对数字的排序是无效的,所以需要另外传进去一个函数来进行判断
  • 相关阅读:
    可视化数据库管理工具DataGrip使用详解
    MySQL常用函数
    你必须掌握的 21 个 JAVA 核心技术!
    idea中那些好用到飞起的插件
    Object使用
    单页面应用和多页面应用的区别及优缺点
    正则常用匹配
    npm --save-dev 和 --save 的区别
    js常用小技巧
    js复制文字到剪切板
  • 原文地址:https://www.cnblogs.com/azoux/p/13306047.html
Copyright © 2011-2022 走看看