js算法---两数之和

我们先来看一下两数之和的题意...

       给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
 示例:
 给定 nums = [2, 7, 11, 15], target = 9
 因为 nums[0] + nums[1] = 2 + 7 = 9
 所以返回 [0, 1]

首先我们来看第一种解法儿

var nums = [2, 7, 11, 15];
function twoSum(arr, target) {
      var brr = [];
      for (var i = 0; i < arr.length; i++) {
          for (var j = 0; j < arr.length; j++) {
              if (arr[i] + arr[j] === target) {
                  brr[0] = j;
                  brr[1] = i;
              }
          }
      }
      return brr;
  }
let result = twoSum(nums, 18);
console.log(result)

这种方法是用两层循环解出来的,也叫暴力法,很好理解,简单暴力,就是先把数据循环一次,然后每循环到一个值的时候,再把所有的数据循环一次然后去比对,看看两个值是不是符合条件。这种方法的时间复杂度:O(n^2),空间复杂度为O(1)。简单的来说,两层for循环肯定要大很多,那么问题就来了,我们能不能用一层循环就把这个问题解决呢??

我们来看看第二种方法,一层循环的解法。

   var nums = [2, 7, 11, 15];
    function twoSum(arr, target) {
        var obj = {};
        var brr = [];
        //debugger;
        for (var i = 0; i < arr.length; i++) {
            let a = arr[i];
            let b = target - a;
            if (obj[a] !== undefined) {
                brr = [obj[a], i];
            } else {
                obj[b] = i;   
            }
        }
        return brr;
    }
    let result = twoSum(nums, 9);
    console.log(result)

这种方法我们用了一遍哈希表也就是一层循环,相比之前第一种方法,时间复杂度变为了O(n),空间复杂度:O(n)。很明显这种方法压力会比第一中轻很多。就是把值先存在一个地方,然后看看有没有和他匹配的值。

在开始我们算法旅程的时候,debugger是一个特别好用的东西,可以把代码中的注释解开,就是我们常说的打断点,然后去看每一次循环中的值得变化,便于我们更好的去理清逻辑。

你可能感兴趣的:(js算法---两数之和)