1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| from typing import List
class Solution(object): """ 类似双重循环的暴力解 但是内部循环切除了前面已经遍历过的 比如说 目标为 7,前面两个数字为 4,2,…… 第一次循环已经判断 4 + 2 != 7了 第二次从 2 开始遍历,就不用从头开始,再计算一遍 2 + 4了 """ def twoSum1(self, nums, target): for i in range(len(nums)): res = target-nums[i] if res in nums[i+1:]: return [i, nums[i+1:].index(res)+i+1] """ 时间复杂度为O(n)的解 我的一开始的疑惑是,在字典中用 in 搜索,不和list中一样吗 但其实字典采用的是Hash结构,在存储键值对 k-v时,会对k进行hash散列得到一个内存地址,将v存入 使用 in 搜索时,也是对关键字进行hash散列,直接去得到的地址中取值,若不为空则找到 故此时间复杂度为O(1) """ def twoSum2(self, nums: List[int], target: int) -> List[int]: d = {} for i in range(len(nums)): c = target - nums[i] if c in d: return [d[c], i] d[nums[i]] = i return []
""" 稍微简化了第二段代码 使用了enumerate(nums) enumerate 是 Python 中一个非常有用的内置函数, 它用于在遍历可迭代对象(如列表、元组、字符串等)时同时获取元素的索引和值。 """ def twoSum3(self, nums: List[int], target: int) -> List[int]: d = {} for index, num in enumerate(nums): c = target - num if c in d: return [d[num], index] d[num] = index return []
|