-Hash Table练习 (Python)

June 27, 2019  Two Sum

  • 题解一:Two-pass Hash Table

思路:目标是查找序列里符合条件的值的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]]
  • 题解二:One-Pass Hash Table (Runtime 36ms, Memory 14.4MB)

仅使用一次迭代怎样完成呢?我们可以边把值从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格子就可以了,也不存在时间复杂度的问题,是一道水题。

你可能感兴趣的:(数据结构)