1两数之和
题目地址
给个数组和目标,求数组中那两个数可以组成目标
一般都想到两个for循环暴力解
标准答案给到一个hash表
通过将循环过的数字保存进去,这样可以智通过以此循环就能找到对应的两个数字
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
hashtable=dict()
for i,num in enumerate(nums):
if target-num in hashtable:
return [hashtable[target-num],i]
else:
hashtable[nums[i]]=i
这里用到了
seasons = ['Spring', 'Summer', 'Fall', 'Winter']
list(enumerate(seasons))
>>> [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
非常方便,相当于自动定义一个计数器了
3无重复最长子字符串
题目地址
设计了一个滑窗口,但是速度有点慢
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
max_len = 0
left = 0
seen = set() # 记录当前窗口中的字符
for right, char in enumerate(s):
while char in seen: # 如果字符重复,移动左指针
seen.remove(s[left])
print(seen)
left += 1
seen.add(char) # 添加到窗口
max_len = max(max_len, right - left + 1) # 更新最大长度
return max_len
思路:一个个看过来,有重复的就弹出第一个,然后记录最长的长度
但是我的代码比官方答案慢很多,原因是
seen.remove(s[left])
本身就是一个O(n),套在while in里面最坏就是O(n2)
官方答案中使用滑动窗口(双指针)保证每个字符最多被访问 2 次(左指针和右指针各一次)
以下是官方答案:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# 哈希集合,记录每个字符是否出现过
occ = set()
n = len(s)
# 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
rk, ans = -1, 0
for i in range(n):
if i != 0:
# 左指针向右移动一格,移除一个字符
occ.remove(s[i - 1])
while rk + 1 < n and s[rk + 1] not in occ:
# 不断地移动右指针
occ.add(s[rk + 1])
rk += 1
# 第 i 到 rk 个字符是一个极长的无重复字符子串
ans = max(ans, rk - i + 1)
return ans
4寻找两个数组的中位数
题目地址
这个真是做不出来了,一点思路没有,遍历O(n+m)谁都想得出,但O(log(m+n)) 真想不出。直接看答案了
思路:运用二分查找,数组本身是有序的,通过下图找到中位线,最关键的就是如何通过二分法找到中位线,同时保证先左边的最大值小于线右边的最小值。不满足情况的条件下通过移动中位线取查找合适的位置。

LeetCode刷题思路与解法笔记
1102

被折叠的 条评论
为什么被折叠?



