1.两数之和
** 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。**
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解题方法:
1.暴力法:
遍历每个元素,并查找是否存在一个值与target-x相等的目标元素,如果采用传统的两遍遍历,时间复杂度:
O(n^2)空间复杂度:O(1)
执行用时 :
6112 ms, 在所有 Python3 提交中击败了13.21%的用户
内存消耗 :14.6 MB, 在所有 Python3 提交中击败了13.41%的用户
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)):
for j in range(i+1,len(nums)):
if target == nums[i] + nums[j]:
return [i,j]
2.切片法:
当第二次遍历的时候,我们可以采用python的切片list[x:y]来重组第i个数据及其以后的数据
再通过判断if (target - nums[i]) in nums[i:]来解答
执行用时 :952 ms, 在所有 Python3 提交中击败了38.45%的用户
内存消耗 :14.6 MB, 在所有 Python3 提交中击败了13.41%的用户
def twoSum(self, nums: List[int], target: int) -> List[int]:
n=0
for i in range(0,len(nums)-1):
n+=1
if (target - nums[i]) in nums[i+1:]:
return [i,nums[i+1:].index(target - nums[i])+n]
3.哈希表法:
通过以空间换取速度的方式,我们可以将查找时间从 O(n) 降低到 O(1)。哈希表正是为此目的而构建的,它支持以近似恒定的时间进行快速查找。
- 一个简单的实现使用了两次迭代。
- 在第一次迭代中,我们将每个元素的值和它的索引添加到表中。
- 在第二次迭代中,我们将检查每个元素所对应的目标元素(target - nums[i]target−nums[i])是否存在于表中。
- 注意,该目标元素不能是 nums[i] 本身!
- 时间复杂度:O(n)
我们把包含有 n个元素的列表遍历两次。由于哈希表将查找时间缩短到 O(1) - 空间复杂度:O(n)
所需的额外空间取决于哈希表中存储的元素数量,该表中存储了 n 个元素 - 执行用时 :64 ms, 在所有 python3 提交中击败了62.71%的用户
- 内存消耗 :15.1 MB, 在所有 python3 提交中击败了5.78%的用
- 时间复杂度:O(n)
hashmap={}
for i,n in enumerate(nums):
if target - n in hashmap:
return [hashmap.get(target - n),i]
hashmap[n] = ii
4.利用字典:
- 首先是if语句中,要在dict里找,而不是在nums里找
- 关于查重:由于题目限制 ( i != j ) 看到其他解法中要考虑到判断是否找到的数为本身。
在python dictionary中,每个key是唯一的。
而我们只遍历list一次,list里本身的数字没有重复,所以每个数最多只会在dict中作为key存储一次。
执行用时 :64 ms, 在所有 Python3 提交中击败了62.90%的用户
内存消耗 :15 MB, 在所有 Python3 提交中击败了5.48%的用户
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
dict = {}
for i in range(len(nums)): #遍历所有数字,num1
if (target - nums[i]) in dict: ## num2=target-num1, 如果num2在dict里,
j = dict[target - nums[i]] ## 则找到num2对应的value(也就是下标)
return [i, j]
else:
dict[nums[i]] = i
** 有没有更好的解题的方法呀?感觉自己这几种解法都存在缺陷,有更优结算的大佬们麻烦把代码和思路留下,谢谢!!!**