当前位置: 首页 > news >正文

Leetcode Hot100之哈希表

1. 两数之和

  • 题目描述
    给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
    你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现
  • 思路
    通过哈希表保存每个数字nums[i]对应的下标,并查找target-nums[i]是否在哈希表中,这样可以通过一次遍历就完成;
    时间复杂度: O(N);空间复杂度: O(N)
  • 代码
    class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:n = len(nums)if n < 2:return []dic = {}for i in range(n):if target - nums[i] in dic:return [dic[target - nums[i]], i]dic[nums[i]] = i
    

2. 字母异位词分组

  • 题目描述
    给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
    字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
    示例 1:

      输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
    
  • 思路
    提到字母异位词要联想到两点:(1) 字母异位词的字母计数的哈希表是相同的 (2)字母异位词按照字母序排序后的字符串是相同的
    本道题就是要将字母异位词进行聚类,判断方式无非上面两种,由于我们通过字典存储聚类字母异位词,而字典是不可哈希的,无法作为字典的key,因此就将排序后的字母异位词作为key;
    时间复杂度:O(nklog⁡k)其中 n是 strs 中的字符串的数量,k是 strs 中的字符串的的最大长度。
    空间复杂度:O(nk)

  • 代码

    class Solution:def groupAnagrams(self, strs: List[str]) -> List[List[str]]:n = len(strs)if n == 0:return []dic = {}for i in range(n):s = strs[i]s_sorted = "".join(sorted(s))if s_sorted not in dic:dic[s_sorted] = [s]else:dic[s_sorted].append(s)return [value for value in dic.values()]
    

    如果想通过字母计数哈希表的方式来实现,则不能用字典来计数,需要用列表,然后再转成tuple,可以作为dict的key:

    class Solution:def groupAnagrams(self, strs: List[str]) -> List[List[str]]:mp = collections.defaultdict(list)for st in strs:counts = [0] * 26for ch in st:counts[ord(ch) - ord("a")] += 1# 需要将 list 转换成 tuple 才能进行哈希mp[tuple(counts)].append(st)return list(mp.values())
    

3. 最长连续序列

  • 题目描述
    给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
    请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
    示例 1:

      输入:nums = [100,4,200,1,3,2]输出:4解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
    
  • 思路
    由于序列是无序的,而题目要求O(n)的解法,那么想到用哈希表实现,注意哈希表题目有的用字典方便,有的用数组方便,有的用集合方便,集合(set)是一个无序的不重复元素序列。本题就是用set比较合适,因为我们只要方便查找哪些元素是否出现即可,不需要用到其他信息

    1. 首先将所有元素放入set中
    2. 遍历set中的元素num,如果num-1在set中说明num并不是一个连续序列的起点;如果num是一个连续序列的起点,那么依次判断num+1,num+2是不是在set中,即可获取以num为起点的连续序列的长度;
      时间复杂度:O(N);因为每个元素只会被遍历一次,因此数组中的每个数只会进入内层循环一次
      空间复杂度:O(N)
  • 代码

    class Solution:def longestConsecutive(self, nums: List[int]) -> int:n = len(nums)if n == 0:return 0nums_set = set(nums)res = 1for i in nums_set:if i - 1 not in nums_set:cur_l = 1cur_num = iwhile cur_num + 1 in nums_set:cur_num += 1cur_l += 1res = max(res, cur_l)return res
    
http://www.lryc.cn/news/375755.html

相关文章:

  • Vision Transformer with Sparse Scan Prior
  • 笔记-python 中BeautifulSoup入门
  • Tomcat Websocket应用实例研究
  • leetcode-11-二叉树前中后序遍历以及层次遍历
  • Python基础学习笔记(十一)——集合
  • FineReport
  • 嵌入式就业前景好么
  • 为啥找对象千万别找大厂男,还好我不是大厂的。。
  • 如何查看k8s中service的负载均衡策略
  • Linux-DNS域名解析服务01
  • [c++刷题]贪心算法.N01
  • 推荐常用的三款源代码防泄密软件
  • Android 13 高通设备热点低功耗模式(2)
  • web前端任职条件:全面解析
  • 分析医药零售数据该用哪个BI数据可视化工具?
  • 如何使用芯片手册做软件开发?
  • 基于深度学习的文本翻译
  • Unity制作透明材质直接方法——6.15山大软院项目实训
  • 【HarmonyOS NEXT】如何通过h5拉起应用(在华为浏览器中拉起应用)
  • 模板方法模式(大话设计模式)C/C++版本
  • 数据提取:数据治理过程中的质量保障
  • 第55期|GPTSecurity周报
  • 移植案例与原理 - utils子系统之file文件操作部件
  • 个股期权有哪些股票?金融新手必须知道!
  • 平庸的学术工作者
  • 安卓软件自动运行插件的开发源代码介绍!
  • 小程序餐饮点餐系统,扫码下单点菜,消费端+配送端+收银端+理端
  • 说说你这个项目的架构情况吧?
  • 接口响应时间测试
  • C++ 61 之 函数模版