(1) 哈希表全思路-20天刷完Leetcode Hot 100计划

计划中一天5+道LeetCode题,因为是第一次写,速度比较慢,但自己会进行纸质笔记整理+CSDN笔记整理,期待20天后熟练掌握!请大家监督我每日更新^^

在Day 1中完成了哈希表3题+滑动窗口2题。

一、哈希表

1. 两数之和

给定nums和target,找到和为target的两个数,返回数组下标

思路

创建一个哈希表,用于在遍历数组时存储已经遍历过的数字与其对应下标。对于新的遍历到的数numsi,查找target - numsi是否已经在哈希表里了:如果在,则找到一组数的和为target;如果还不在,就把新的遍历到的数numsi存进哈希表中。

之所以要用哈希表,是因为它

①题目需要返回数组下标,它能同时对应存放下标和数字

②在哈希表中查找,时间复杂度为O(n)

③题目给的是数组,哈希表的enumerate()方法能够直接将数组变为(索引,元素)配对形式

代码

python 复制代码
class Solution(object):
    def twoSum(self, nums, target):
        nums_to_index = {} #创建一个空的哈希表
        for i, num in enumerate(nums):
            complement = target - num
            if complement in nums_to_index:
                return [nums_to_index[complement], i] #hash_table[value] = key
            else:
                nums_to_index[num] = i
        return []

2. 字母异位词分组

给形如"eat", "tea", "tan", "ate", "nat", "bat"的字符串组,查找出其中哪些是字母异位词,以任意顺序分类返回字母异位词。

思路

首先看到给出的strs格式,它是外包是数组、里面是字符串的形式,我们需要比较的则是字符串中的字符,相当于是三层结构。那么怎么才能得到字符char呢?我们想到sorted()方法 ,是可以将括号中的字符串排序并返回字符列表形式 的;其次,由于需要比较不同顺序的字符串组成,想到:即使是不同顺序的字母异位词,排序后也应该是完全相同的!

因此,我们可以考虑用排序后的词作为哈希表的key,用原词序作为value值,遍历strs,最后只需要按不同的key输出value,就可以了!比较不熟的方法有:

①defaultdict 避免了如果key值不在哈希表中,直接拼接会出现错误的场景,如果新建一个哈希表,拿不准的话都可以用hash_table = defaultdict(list)

②sorted() 将字符串排序并返回为字符列表的形式

③' '.join() 将字符列表以' '为连接符,拼接在一起

④hash_table.values() 是哈希表的一种方法,返回字典中所有value的集合,而不返回key;此外,hash_table.keys() 返回所有 key 的集合。hash_table.items返回所有(key, value)键值对的集合。

代码

python 复制代码
from collections import defaultdict

class Solution(object):
    def groupAnagrams(self, strs):
        anagrams = defaultdict(list)
        for s in strs: #对于三层结构中的每一个字符串来说
            key = ''.join(sorted(s)) 
            #把字符串返回为已排序字符,无连接符地拼接到每一个key中
            anagrams[key].append(s)
            #把原字符串s拼接到每一个key对应的value中
        return list(anagrams.values())
        #返回字典里所有的value集合

3. 最长连续序列

给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。要求时间复杂度为O(n)。

思路

涉及到"找"+O(n),一般就是用哈希表来做了。如果这个题排序的话,时间复杂度肯定超过O(n),所以不能排序。因此把数组变为集合的形式,而集合的底层逻辑就是哈希表,再遍历,找i+1对应的值是否在哈希表中即可。

①set() 方法可以直接将数组转化为哈希表形式

②因为需要长度,所以longest的序列需要被记录起点和终点(2个值)。在遍历过程中,若起点i-1的值也在集合中,则i开头的序列一定比i-1的短

③已知起终点求长度,终点-起点+1

代码

python 复制代码
class Solution(object):
    def longestConsecutive(self, nums):
        nums_set = set(nums) #把数组变为集合形式
        longest = 0
        for i in nums_set:
            if i-1 not in nums_set:
            #如果比i小的也在,那么i一定不是longest的开头
                j = i
                while j+i in num_set:
                    j +=1
                longest = max(longest, j-i+1)
        return longest

3道哈希表就是这样啦!今天还会更一篇滑动窗口。第一天做题感觉还是不容易的,一定不要半途而废呀。希望以后越来越顺畅吧。

相关推荐
代码山河6 小时前
Python就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
在世修行6 小时前
智学文枢:题目流水线
python·多线程·状态机·pyside
梯度下降者7 小时前
零基础入门Python 爬虫
爬虫·python·数据分析·入门指南·webcrawler
UIU1148 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
“AI国潮设计-小江”8 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
论文复现现场9 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi9 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
benchmark_cc9 小时前
用 Python 拉 A 股全市场实时快照:Notebook 请求、结果校验与易错点
python·数据分析·pandas·量化交易·股票数据·quantdash
伞伞悦读10 小时前
【第70期】Adam二阶矩不是方差:偏差校正、动量与AdamW完整实验
python
秋天的怀念_David10 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法