June 27, 2019 Two Sum
思路:目标是查找序列里符合条件的值的index,而Hash Table是映射数组里值和index的最好的方法,因此需使用Hash Table,使时间复杂度为O(1), 当发生碰撞时,时间复杂度为O(n).
步骤:使用两次迭代。(Runtime 40ms, Memory 15MB)
第一次迭代将每一个Value和它的Index送入Table。以Value做键值,Index做table的Value
第二次迭代检查 (target - nums[i]) 是否在Table中。
Java 有现成的HashMap类去实现Hash Table,Python怎么做?字典!
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
Map = {v: i for i, v in enumerate(nums)}
for i in range(len(nums)):
complement = target - nums[i]
if complement in Map and Map[complement] != i:
return [i, Map[complement]]
仅使用一次迭代怎样完成呢?我们可以边把值从array里送进Hash table中,同时,在table中向前查找是否有合适的值与正在插入的值加起来为target。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
Map = {}
for i in range(len(nums)):
complement = target - nums[i]
if complement in Map:
return [Map[complement], i]
Map[nums[i]] = i
June 28, 2019 Longest Substring Without Repeating Characters
思路:如果一个子串S 已经被检查了不含有重复字符,我们只要检查S[j]是否已经存在于S。但是这样做,就需要用 i 和 j 用两个循环遍历字符串,使得时间复杂度为O(n^2)。这里可以考虑使用 sliding window ——一种常见的处理 array/string 问题的算法!(我也是第一次学)
一个 window,代表array/string 的一个范围,用 index 表示:[i, j)。slide 操作指的是,如果我们将 window [i, j) 向右每次移动一个元素,下一个window就变成了[i+1, j+1).
可以用HashSet来存储 当前的window [i, j),初始化时,i==j。然后将 j 向右滑动(j++),如果S[j]不在HashSet里,就将 j 向右继续滑,直到 S[j] 存在于当前window中。如果我们对所有的 i 都这样做,那样就能得到最终答案。
但是,如果S[j] 在滑窗中有同样值的话,我们不用一点一点的增加 i, 而是将 i移到原范围里与S[j]重复的那个值的下一位。这样的话,我们可以建立一个HashMap,来使得Key (element)不重复出现。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
n = len(s)
ans = 0
map = {}
i = 0
for j in range(n):
if s[j] in map:
i = max(map[s[j]], i)
ans = max(ans, j-i+1)
map[s[j]] = j+1
return ans
June 30, 2019 Valid Sudoku
这道题其实很简单,只要遍历每一行,再遍历每一列,再便厉每一个3×3格子就可以了,也不存在时间复杂度的问题,是一道水题。