数组、双指针与哈希表
Q1 两数之和 Two Sum
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
你可以按任意顺序返回答案。
思路1:
最简单的方法,通过双循环遍历数组直到找到一个合适的解,时间复杂度为O(N2 )
class Solution:
def twoSum(self,nums,target):
sol=[]
if len(nums)<2:
return sol
for i in range(len(nums)):
for j in range(i+1,len(nums)):
if nums[i]+nums[j]==target:
sol.append([i,j])
return sol
思路2:
哈希表映射,在python中的体现为字典的使用,当目标值与当前值的差存在于字典中时则返回差值与当前值的下标,若不存在,则在字典中加入当前值与下标的键值对。需要注意的是,只需要知道差值是否在字典里面就可以了。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
dic={
}
for i in range(len(nums)):
if target-nums[i] in dic: #如果差值存在于字典中则返回差值与当前值的下标
return [dic[target-nums[i]],i]
dic[nums[i]]=i
Q3 无重复字符的最长子串 Longest Substring Without Repeating Characters
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
思路:哈希表
不含重复字符的最长字串意思就是两个相邻重复元素之间的最长距离
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
dic={
}
start=-1 #为了让第一个字符串元素的坐标录入
ans=0
for end in range(len(s)):
if s[end] in dic:
start=max(dic[s[end]],start)
ans=max(ans,end-start)
dic[s[end]]=end ,
return ans
先用字典查找是否出现了相同元素,从而判断起始索引start的位置,如果出现相同的元素,那么start会移到最近的索引。
Q15 三数之和 Three Sum
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0