leetcode刷题总结(Python):哈希表

综述

本文收录了leetcode热题中的一些典型哈希表题目

1.两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

方法一:纯数组解法

    def twoSum(self, nums: List[int], target: int) -> List[int]:
        re = []
        for i in range(len(nums)-1):
            if target - nums[i] in nums[i+1:]:
                re.append(i)
                tp = nums[i+1:].index(target - nums[i])+i+1
                re.append(tp)
                break
        return re

基本思路:遍历数组,对数组任一元素num,在num往后的子数组中查找target-num
时间复杂度:O(nlogn),由于数组的查找复杂度为O(logn),所以总的时间复杂度为O(nlogn)
空间复杂度:O(1)

方法二:哈希表解法

    def twoSum(self, nums: List[int], target: int) -> List[int]:
        h = {}
        for i in range(len(nums)):
            if target - nums[i] in h:
                return [i, h[target - nums[i]]]
            else:
                h[nums[i]] = i
        return []

基本思路:构造哈希表,key为数组元素num, value为num的当前索引,遍历数组,若target-num在哈希表中,返回结果,否则更新哈希表。
时间复杂度:O(n),由于哈希查找复杂度为O(1),所以时间复杂度为O(n)
空间复杂度:O(n),维护了一个复杂度为O(n)的哈希表

2.无重复字符的最长子串

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

方法一:暴力穷举

思路:对任意0≤i≤j≤n,判断s[i:j]是否为无重复子串,若是,更新最大长度
时间复杂度:O(n^2)
空间复杂度:O(1)

方法二:哈希表+双指针

    def lengthOfLongestSubstring(self, s):
        hashmap = {}
        i, ans = 0, 0
        for j in range(len(s)):
            if s[j] in hashmap:
                i = max(hashmap[s[j]], i)
            ans = max(ans, j - i + 1)
            hashmap[s[j]] = j + 1
        return ans

思路:定义一个哈希表,键为字符,值为该字符最近一次出现的位置+1(用来更新计算长度的起始位置),遍历字符串中的元素s,慢指针i表示最近一次出现重复字符的位置+1,快指针为s的位置,更新最长长度为j-i+1的最大值
时间复杂度:O(n)
空间复杂度:O(n),维护一个规模为len(set(s))的哈希表

你可能感兴趣的:(Python)