当前位置: 首页 > 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
    

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 外卖APP开发详解:从同城O2O系统源码开始
  • 【C语言】信号
  • AWS无服务器 应用程序开发—第十六章 CI/CD CodeBuild
  • Java 获取客户端 IP 地址【工具类】
  • FTP 550 No such file or directory-
  • HDFS 面试题(一)
  • Qt Quick介绍
  • js-promise、async/await
  • 缓存技术实战[一文讲透!](Redis、Ecache等常用缓存原理介绍及实战)
  • WPF 深入理解四、样式
  • 用Flask定制指令上传Excel数据到数据库
  • 常用的sql语句
  • 板凳------56.Linux/Unix 系统编程手册(下) -- SOCKET 介绍
  • 4.2、浏览器请求详解(ajax、fetch、axios使用,手写ajax)
  • 【CTS】android CTS测试
  • 2018一半小结一波
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • cookie和session
  • ERLANG 网工修炼笔记 ---- UDP
  • HTML5新特性总结
  • Javascript Math对象和Date对象常用方法详解
  • js继承的实现方法
  • MySQL几个简单SQL的优化
  • spring + angular 实现导出excel
  • vue的全局变量和全局拦截请求器
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 关于extract.autodesk.io的一些说明
  • 关于使用markdown的方法(引自CSDN教程)
  • 如何利用MongoDB打造TOP榜小程序
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 小程序 setData 学问多
  • 一、python与pycharm的安装
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #、%和$符号在OGNL表达式中经常出现
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • (~_~)
  • (175)FPGA门控时钟技术
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (c语言)strcpy函数用法
  • (C语言)共用体union的用法举例
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (备份) esp32 GPIO
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (蓝桥杯每日一题)love
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (三)模仿学习-Action数据的模仿
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (四) 虚拟摄像头vivi体验
  • (四)js前端开发中设计模式之工厂方法模式