算法第一天

132 阅读2分钟

  个人介绍:本人微弱前端小弟一枚,坐标广州。目前就职一私企,担任前端工程师职位。个人平时比较喜欢捣鼓技术,但自己一个人学习太没劲了,学着学着就觉得有点乏味。还依稀记得以前老师讲过,学习要学得好,记得牢,就要自己学一遍,然后给别人讲一遍。所以萌生了一想法,每天学习一道算法题,然后在公众号以及论坛上进行一次分享当天所得。
  至于算法的对于前端的重要性呢?这个已经有很多大佬讨论过,有的说算法对于前端不重要,因为平时工作基本不会用到;有的说算法对于前端很重要,因为面试经常会被问到。而我个人比较倾向后者(很重要),为什么呢?因为算法不单是因为面试经常被问到,平常工作中也会有用到,只是没了解过,所以以为不会用到。就好比下文提到的空间换速度。
  好了!直接开始我们的第一天算法之路。让我们先从leetcode第一题(两数之和)开始说起。这边刷算法使用的编辑器会以vscode为主,题库会以leetcode上的题目来进行选择。先上题目:

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

  这道题呢有两种解法:第一种暴力破解,双重for循环;第二种空间换速度 先来看第一种,因为使用双重for循环,所以时间复杂度为O(n^2)。

var towSum = function(nums, target) {
  for (let i = 0; i < nums.length; i++) {
    for (let j = i + 1; j < nums.length; j++) {
      if (nums[i] + nums[j] === target) {
        return [i, j]
      }
    }
  }
}

  第二种,使用一个数组把已经遍历过的但暂时达不到条件的元素存到数组中,然后后面再拿出来对比。这种相比上面少了一层for循环,时间复杂度为O(n)。

var twoSum = function(nums, target) {
     const hash = []
     for (let i = 0; i < nums.length; i++) {
         let res = target - nums[i]
         if (hash[res] >= 0) return [hash[res], i]
          hash[nums[i]] = i
     }
};

  至此,可以得知。学会算法,有助于代码的性能优化。好了!第一天就到这