Leetcode刷题笔记
小白一个,零基础,想通过这种方式记录自己的leetcode刷题之路。
看看能坚持到什么时候吧。hhhhh。
Day1 两数之和
先从最简单的开始吧,这是leetcode的第一题。给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。
思路一:暴力遍历,将target减去nums数组中第一个元素,将结果result遍历nums数组,如果有这个值,返回两个元素的下标。如果没有,target会去减第二个元素。直到循环结束。如果都没有找到,最后会返回[0,0],由于元素不可以重复利用,所以不用担心出现找到的情况是 [0,0]的这一情况。(由于leetcode说明一定有解,所以[0,0]这种情况是不可能发生的 hhhh)
思路写在上面了 所以代码就没有注释了(好像是个不好的习惯)
这种方法的缺点也很明显,就是for里面嵌套一层for 所以时间复杂度是O(n2)(平方的意思,我不知道怎么打 = =),有一说一,刚开始想出这种方法还很激动。
什么,这种方法运行时间居然是0ms?连续跑了几次还是这样。。。
思路二:用HashMap来实现,键是数组中的值,value是数组的索引。第一步是同思路一一样,我们去遍历数组nums,用目标值target-nums[i]得到result,如果哈希表中没有这个result这个键,我们就把num[i]和对应的索引加入hashmap中,如果result存在哈希表中,我们就返回索引值i以及这个result键所对应的value。最后时间复杂度是O(n)。这个方法是看评论区大佬学来的(淦!什么时候我有这么强就好了,明明基础阶段也学了HashMap,怎么没想到用呢。方法是自己理解后用自己的语言说的)
这里有个自己写这种方法的时候遇到的问题吧。
哈希碰撞的问题
这个问题我也想过,万一有俩一样的key存进去不就更新了value吗,后来我想想了,如果这两个key相等的话,要么相加等于target,要么不等。如果相等的话,一个其实是还在nums数组里,另一个在Hash表中,这时候分别返回一个数组的索引以及key对应的value即可。如果不等于target,更新key的value也没事。比如[2,2,4],6。无论返回哪个2都是对的。
这个方法只有一个for循环,所以时间复杂度是O(n)。
看起来两个方法好像差不多 = =,其实还是差很多的哈。