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

leetcode hot100刷题日记——2.字母异位词分组

涉及知识点:vector、哈希表

  • 解答
    • 我的解答的时间复杂度分析
    • 我的解答的空间复杂度分析
    • 复习:排序算法的时间复杂度

和第一题需要的知识点相同,所以知识点复习可见 link1《leetcode hot100刷题日记——1.两数之和》

在这里插入图片描述
解题思路:是字母异位词的字符串的组成字母是相同的,所以可以对从strs取出来的字符串按照字母顺序排序,并作为hash表唯一的key。如果是字母异位词,那就放在一个key里。

解答

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {//建立一个哈希表,哈希表的key是字母串(按照字母顺序排序),value是和字母串字母相同的数组元素unordered_map<string,vector<string>>map;for(string &str:strs){string sorted=str;sort(sorted.begin(),sorted.end());//这里要注意一下字符串内部的字母是咋排序的map[sorted].push_back(str);}vector<vector<string>> res;for(auto &m:map){res.push_back(m.second);//first,second联想一下}return res;}
};

我的解答的时间复杂度分析

  • 遍历字符串数组:需要对输入的字符串数组进行一次完整遍历,时间复杂度为 O(n),其中 n 是字符串的数量。
  • 排序每个字符串:对每个字符串进行排序的时间复杂度取决于字符串的长度 k。对于每个字符串,排序的时间复杂度为 O(klogk)。因此,对于所有 n 个字符串,总时间复杂度为 O(n⋅klogk)。
  • 遍历哈希表构建结果:遍历哈希表并将每个分组添加到结果列表的时间复杂度为 O(m⋅l),其中 m 是哈希表中键值对的数量(即不同字母组合的数量),l 是每个分组的平均字符串数量。在最坏情况下,所有字符串互为不同变位词,此时 m=n 且 l=1,总时间复杂度为 O(n)
  • 综上,整个算法的时间复杂度为 O(n⋅klogk),其中 k 是字符串的平均长度,主导因素为排序操作的耗时。

我的解答的空间复杂度分析

  • 哈希表:哈希表需要存储每个排序后的字符串作为键,以及对应的原始字符串列表作为值。
    每个键的长度为 k,假设所有键的总数为 m,键的总空间为 O(m⋅k);
    每个值存储原始字符串列表,所有值的总空间为 O(n⋅k)(所有原始字符串的总长度)。
  • 结果列表:结果列表中包含所有字符串,总空间为 O(n⋅k)。
    因此,整个算法的空间复杂度为 O(n⋅k+m⋅k)。在最坏情况下(所有字符串互为不同变位词),m=n,空间复杂度为 O(n⋅k);在最优情况下(所有字符串为同一变位词),m=1,空间复杂度仍为 O(n⋅k)

复习:排序算法的时间复杂度

排序算法最好情况时间复杂度平均情况时间复杂度最坏情况时间复杂度
冒泡排序 (Bubble Sort)O(n)O(n^2)O(n^2)
选择排序 (Selection Sort)O(n^2)O(n^2)O(n^2)
插入排序 (Insertion Sort)O(n)O(n^2)O(n^2)
希尔排序 (Shell Sort)O(nlogn)O(n^1.25)O(n^2)
归并排序 (Merge Sort)O(nlogn)O(nlogn)O(nlogn)
快速排序 (Quick Sort)O(nlogn)O(nlogn)O(n^2)
堆排序 (Heap Sort)O(nlogn)O(nlogn)O(nlogn)
计数排序 (Counting Sort)O(n+k)O(n+k)O(n+k)
桶排序 (Bucket Sort)O(n+k)O(n+k)O(n^2)
基数排序 (Radix Sort)O(n⋅k)O(n⋅k)O(n⋅k)
http://www.dtcms.com/a/197857.html

相关文章:

  • discuz X3.5批量新建用户
  • 分别用 语言模型雏形N-Gram 和 文本表示BoW词袋 来实现文本情绪分类
  • 【聚类】 K-means
  • [创业之路-361]:企业战略管理案例分析-2-战略制定-使命、愿景、价值观的失败案例
  • 第12章 Java多线程机制
  • 什么是迁移学习(Transfer Learning)?
  • 图绘Linux:基础指令脉络阁
  • 高效查询:位图、B+树
  • iOS 工厂模式
  • 【AGI】模型性能评估框架EvalScope
  • C++函数基础:定义与调用函数,参数传递(值传递、引用传递)详解
  • ubuntu 安装mq
  • 碎片笔记|PromptStealer复现要点(附Docker简单实用教程)
  • web系统安全管理
  • Java核心API实战:从字符串到多线程全解析
  • 企业级小程序APP用户数据查询系统安全脆弱性分析及纵深防御体系构建
  • 禾本科植物胚乳的发育
  • 定时器相关概念
  • CSS 浮动(Float)及其应用
  • 2025年、2024年最新版IntelliJ IDEA下载安装过程(含Java环境搭建+Maven下载及配置)
  • Java求职面试揭秘:从Spring到微服务的技术挑战
  • 知识图谱(KG)与大语言模型(LLM)
  • 前端获取用户的公网 IP 地址
  • btc交易所关键需求区 XBIT反弹与上涨潜力分析​​
  • |从零开始的Pyside2界面编程| 环境搭建以及第一个ui界面
  • 6.2.5图的基本操作
  • 深入解析Spring Boot与Kafka集成:构建高性能消息驱动应用
  • 二分算法的介绍简单易懂
  • 玄机-第一章 应急响应-Linux日志分析
  • Visual Studio已更新为17.14+集成deepseek实现高效编程