leetcode第一题,两数之和(Two Sum),JavaScript实现

1,825 阅读3分钟
   本博客的作者与csdn里Tank_in_the_street的作者是同一作者,转载文章需写明出处,谢谢合作。

       好好学习,天天向上。不会算法和数据结构的前端不是一个好前端,为了能够让自己的能力得到更多的提升,小弟开始入坑了leetcode的刷题之旅,为日后升职加薪或者跳槽提供更多的能力基础。

闲话少说,开始leetcode的第一题,在讲第一题之前,先了解一下该题。

       该题的题目描述是在一个数组里寻找两个数,如果两个数加起来等于目标值的话则返回他们的下标。这里有个前提就是这两个数的下标是不能相同的。了解到这一点后可能很多同学都想到一种解法就是用双重for循环暴力解。但是这种方法牺牲时间来解题,时间复杂度为n的平方,个人觉得既然都做算法题了肯定是要对时间进行优化。所以我的第一种做法是将数组中的value值传入一个对象里作为该对象的属性,而该对象对应属性的属性值则是与数组的value对应的下标index值。之后遍历数组,当目标值(target)减当前数组的value值得到的新值在对象中存在并且当前下标不等于该新值所在对象的属性值时则确定找到了这两个下标。关键代码如下:

       最终得出来的结果是时间复杂度是n,然而这道题通过之后我在想,好像这道题我牺牲了一点空间来换取时间的最优化,那么有没有方法在不太牺牲空间的情况下时间也可以最优化呢。看了一下leetCode里面的最快方法,其中运行时间56ms的代码是这样子的:

       然而这种做法是牺牲时间来换取空间,if判断里的in其实是JavaScript引擎里对对象进行了一次遍历,所以我觉得该方法实际上的时间复杂度其实也是n的平方,并且自己也运行了一遍结果是这样的:

       倒是后面60ms那个才是真正意义上的在不牺牲空间、用一层for循环下达到算法的最优化:

       自己运行了一遍的确是比我现在的算法在空间上更加的优化:

       然后我思考了一下这个算法,这个算法的判断比我少判断了一个当前下标是否重复,原因是他的对象属性都是每次遍历最后才添加,而不是像我那样先一个for循环储存所有obj的属性值。这个方法的优点在于for循环最坏情况下是遍历完,最好的情况是第二次遍历就可以跳出循环,obj里不会存有太多属性。而我的由于一开始就为obj存入所有的属性,所以不管我这个循环最好还是最坏情况都比他多遍历一个数组。由于我的对象里有所有的属性值,所以还需要判断一次当前下标是否重复。