给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [3,2,4], target = 6 输出:[1,2]
这道题我们通常有两种解法:
第一种是暴力法,就是我们常见的思路双for循环,我们来分析一下为什么我们能这么简单地想出这个办法?其实就是遍历的思想,当你锚定第一个元素的时候,然后以此遍历接下来的每一个元素,其本质是:主动的寻找元素和第一个元素进行比较,所以第一种方式的比较次数会从高到低依次降低,即第一次是两次,第二次就是1次,从共是C32,也就是3次。但是一旦数组非常大的时候,那么遍历所花费的时间就很多了,时间复杂度是O(n2)。所以有没有时间复杂度更少的解法呢?
第二种是哈希表,这个解法有什么优势呢?其本质是什么呢?其实就是换了一种比较的思维,上一种方式中,都是锚定一个元素然后主动地和剩下的元素去比较,这种方式是主动的,比较次数依次减少,而哈希表是空间换时间,先建立一个哈希表,先让第一个元素自己躺进去,然后等别人和他来比较,换句话说就是从“主动”变为“被动”,那变成被动的就有优势啦?这个时候就要说说哈希表的特点了。不管是暴力法还是哈希表,都是有第一轮遍历的,但是在遍历的时候,两者做的事情确实不一样的!暴力法是在遍历第一个元素的时候,继续使用遍历,继续看剩下的元素,而哈希表是直接拉着第一轮遍历的元素来哈希表比较,在这个示例中,我们要求和,那么这个时候就要拿着第一轮遍历元素和target的差值来到哈希表中寻找,而哈希表寻找的时间复杂度是O(1),所以这个时候时间复杂度就比第二次遍历的时间复杂度要低很多了,如果在哈希表中没有找到的话,由于该元素只比较了第一个元素,没有和之后的元素进行比较,所以也要扔到哈希表中,这样话,到最后,比较的次数是逐次增加的,第一次是1次,第二次是两次,总共是C32,也就是3次。其中这种先比较后扔进去的方式也是很巧妙的,一开始的时候也很难想出来,因为如果知道用哈希表计算的话,很多人都会想着一开始就将所有的元素一起扔进哈希表中,然后再来遍历第一轮元素,然后一个个比较就好了。总之,哈希表的前种方式是将后种的两个步骤合二为一了。
那怎么实现呢?
在C语言中,需要手搓哈希表,所以非常不友好,不过奈何本人水平有限,只会C,所以借鉴了一下其他人的代码,代码如下: