力扣hot100 -- 哈希

目录

🌼两数之和

暴力

二分

哈希

🌼字母异位词分组

unordered_map + 排序

unordered_map + 计数

🌼最长连续序列

unordered_set + 跳过前驱

排序 + dp


🌼两数之和

1. 两数之和 - 力扣(LeetCode)

暴力

O(n^2)  两层循环

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) { // 返回vector数组int n = nums.size();for (int i = 0; i < n - 1; ++i)for (int j = i + 1; j < n; ++j) if (nums[i] + nums[j] == target)    return {i, j};return {}; // 返回空数组}
};

二分

O(nlogn)

O(nlogn)    整数二分      整数二分需要注意边界,防止下取整的坑(死循环)

排序 O(nlogn) 

外层for  O(n)   *    for 循环里二分 O(logn)     =   O(nlogn)

详细解释下第 32 行

if (a[i].x == a[l].x) l++; // 避免同一个元素, 索引++(最关键)

比如 i == 2, l == 4,2 + 4 == 6,而假设此时双方的值都是3,3 + 3 == 6

那么就会输出同一个元素的下标,需要索引 + 1

AC  代码

#include<algorithm> // sort()
using namespace std;struct node {int v, x; // value 和 index
}a[10010];bool cmp(node x, node y)
{return x.v < y.v;
}class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {int n = nums.size();for (int i = 0; i < n; ++i)a[i].v = nums[i], a[i].x = i; // 先结合sort(a, a + n, cmp); // 再排序(结构体数组)// 遍历for (int i = 0; i < n; ++i) {int l = 0, r = n - 1;while (l < r) { // 二分int m = (l + r) >> 1;if (a[m].v >= target - a[i].v) // target - a[i].v 为要查找的值r = m;elsel = m + 1;}// 退出 while 后, l == rif (a[i].v + a[l].v == target) {if (a[i].x == a[l].x) l++; // 避免同一个元素, 索引++(最关键)return {a[i].x, a[l].x}; // 返回下标}}return {}; // 返回空数组}
};

哈希

O(n)

知识

map<string, int>a; //升序
map<string, int, greater<string> >a; //降序h[key] = val;
//等价于
h.insert(make_pair(key, val));for(map<string, int>::iterator it = a.begin(); it != a.end(); ++it)cout<<it->first<<"\t"<<it->second<<endl;
size/empty/clear //元素个数,判空,清空
begin / end //指向开始 / 结束位置的指针
insert(x) //将元素x插入集合(x为二元组)
erase(x) //删除所有等于x的元素(x为二元组)
erase(it) //删除it指向的元素(it为指向二元组的迭代器)
find(k) //查找键为k的二元组的位置, 若不存在, 返回尾指针 .end()

C++ map和unordered_map详解-腾讯云开发者社区-腾讯云 (tencent.com)

AC  代码

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) { // 返回vector数组int n = nums.size();unordered_map<int, int> h; // 键 元素大小;值 元素下标for (int i = 0; i < n; ++i) {auto it = h.find(target - nums[i]); // 查找这个键 -- 元素大小if (it != h.end()) // 找到了该元素return {i, it->second}; // 返回下标//h.insert(make_pair(nums[i], i)); // 插入键值对h[nums[i]] = i; // 插入键值对}return {}; // 返回空数组}
};

🌼字母异位词分组

49. 字母异位词分组 - 力扣(LeetCode)

知识

1)emplace_back 与 push_back

一文弄清楚 push_back 和 emplace_back 的区别-emplace_back和push_back有区别吗 (51cto.com)

2)unordered_map 与 map

map和unordered_map区别及其优缺点 - 己平事 - 博客园 (cnblogs.com)

map、multimap 容器都会自行根据的大小对存储的键值对进行排序 

3)代码中,两个要注意的点

(一)引用传递 比 迭代器 快很多(访问vector<string>时)

// 引用传递
for (string& str : strs) // 迭代器
for (vector<string>::iterator it = strs.begin(); it != strs.end(); ++it)

(二)emplace_back 比 push_back 快 20%

unordered_map + 排序

O(n*k*logk)      n -- strs中字符串数量    k 单个字符串最大长度    ≈  5*1e6

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string, vector<string> > s; // 键 string  值 vector<string>vector<vector<string> > ans; // 返回类型// 遍历字符串数组 strsfor (string& str : strs) { // 引用传递 快很多string key = str;sort(key.begin(), key.end());s[key].push_back(str);}// for (vector<string>::iterator it = strs.begin(); it != strs.end(); ++it) {//     string key = *it; // 键//     sort(key.begin(), key.end()); // 对键排序//     s[key].push_back(*it); // 键 -- 排序后的值// }for (auto t : s) ans.push_back(t.second); // 插入vector<string>类型数组// for (auto it = s.begin(); it != s.end(); ++it)//     ans.push_back(it->second);return ans;}
};

unordered_map + 计数

O(n*k)

排序  -->  计数,变相得到了每个字符串按字典序的排序(隐含的是:int 和 char 之间的

隐式转换

但是有个疑问,如果一个字母出现100次,' ' + 100 == 132,超过了ASCII的127范围,超过范围阶段,可能和前面的冲突才对

可能是样例太少了

注意:& 比 不用&,快很多,避免将元素的值复制到新的变量中

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {// 键--已排序字符串      值--未排序字符串 组成的数组unordered_map<string, vector<string> > s;vector<vector<string> > ans; // 数组元素为 vector<string>for (string& str : strs) { // str 每个字符串// string count = string(26, ' '); string count(26, ' ');for (char& c : str) // c 一个字符count[c - 'a']++;s[count].push_back(str); // 插入键值对}for (auto& t : s) // t--unordered_map<string, vector<string>> 类型ans.push_back(t.second); // 插入 vector<string> 类型return ans;}
};

🌼最长连续序列

128. 最长连续序列 - 力扣(LeetCode)

知识 

size/empty/clear //元素个数  判空  清空
begin/end //开始和结束位置
inset(x) //元素x插入集合
erase(x) //删除所有值为x的元素
erase(it) //删除it迭代器指向的元素
find(x) //查找x在集合的位置,不存在则返回end
count(x) //统计x元素的个数
lower_bound(x) //返回大于等于x的最小元素位置
upper_bound(x) //返回大于x的最小元素位置

思路

set 用于去重

unordered_set,不需要有序,所以用 unordered

存在前驱则跳过

unordered_set + 跳过前驱

O(n)

外层循环 for,因为“存在前驱,则跳过”,数组中每个数,只会进入 内层 while 循环 1 次

所以外层 O(n),内层 O(1)

class Solution {
public:int longestConsecutive(vector<int>& nums) {int ans = 0; // 初始0 有可能空数组unordered_set<int> s; // 去重for (const int& num : nums) // 引用传递s.insert(num);for (auto& num : s) { // 遍历哈希表if (s.count(num - 1)) continue; // 存在前驱 -- 跳过当前int currentNum = num, currentLen = 1; // 当前长度 1while (s.count(currentNum + 1)) {currentLen++; // 长度 +1currentNum++; // 值 +1}ans = max(ans, currentLen);}return ans;}
};

排序 + dp

很好奇,为什么 O(nlogn) 的复杂度,要比上面的 O(n) 快得多........

class Solution {
public:int longestConsecutive(vector<int>& nums) {if (!nums.size()) return 0; // 避免空数组sort(nums.begin(), nums.end()); // 先排序vector<int> nums2;nums2.push_back(nums[0]);for (int i = 1; i < nums.size(); ++i) if (nums[i] != nums[i - 1]) // 再去重nums2.push_back(nums[i]); int n = nums2.size(), ans = 1;if (n == 0) return 0; // 避免空数组vector<int> dp(n, 1); // 初始化for (int i = 1; i < n; ++i) {if (nums2[i] == nums2[i - 1] + 1)dp[i] = dp[i - 1] + 1;ans = max(ans, dp[i]);}return ans;}
};/*
含义:dp[i] 以第 i 个数结尾的最大长度(下标 0 开始)
递推式:if (nums[i] == nums[i - 1] + 1) dp[i] = dp[i - 1] + 1;
初始化:dp[0...n-1] = 1
遍历顺序:nums[]  0...n-1
打表检查
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2774633.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

春运也要“信号升格”:中兴通讯助运营商打造高铁精品网

一年一度的春运&#xff0c;承载了游子的思乡情。据官方预计&#xff0c;今年春运跨区域人员流动量将达到90亿人次&#xff0c;创下历史新高&#xff0c;铁路、公路、水路、民航等营业性客运量全面回升&#xff0c;其中铁路预计发送旅客4.8亿人次&#xff0c;日均1200万人次&am…

rust语言tokio库底层原理解析

目录 1 rust版本及tokio版本说明1 tokio简介2 tokio::main2.1 tokio::main使用多线程模式2.2 tokio::main使用单线程模式 3 builder.build()函数3.1 build_threaded_runtime()函数新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图…

.NET Core 实现 JWT 认证

写在前面 JWT&#xff08;JSON Web Token&#xff09;是一种开放标准, 由三部分组成&#xff0c;分别是Header、Payload和Signature&#xff0c;它以 JSON 对象的方式在各方之间安全地传输信息。通俗的说&#xff0c;就是通过数字签名算法生产一个字符串&#xff0c;然后在网络…

使用Python进行数据的描述性分析,用少量的描述性指标来概括大量的原始数据

在进行数据分析时&#xff0c;当研究者得到的数据量很小时&#xff0c;可以通过直接观察原始数据来获得所有的信息。但是&#xff0c;当得到的数据量很大时&#xff0c;就必须借助各种描述性指标来完成对数据的描述工作。用少量的描述性指标来概括大量的原始数据&#xff0c;对…

计算机网络相关题目及答案(第五章)

第五章 复习题: R2. 基于逻辑上集中控制的控制平面意味着什么?在这种有情况下,数据平面和控制平面是在相同的设备或在分离的设备中实现的吗?请解释。 答:基于逻辑上集中控制的控制平面意味着控制平面的具体实现不在每个路由器中, 而是在某个集中的地方(服务器). 这种情…

廖雪峰Python教程实战Day 2 - 编写Web App骨架,运行后不显示网页如何解决

教程代码如下&#xff1a; import logging; logging.basicConfig(levellogging.INFO)import asyncio, os, json, time from datetime import datetimefrom aiohttp import webdef index(request):return web.Response(bodyb<h1>Awesome</h1>)asyncio.coroutine de…

【每日一题】LeetCode——链表的中间结点

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有…

【数据结构】二叉树的三种遍历(非递归讲解)

目录 1、前言 2、二叉树的非递归遍历 2.1、先序遍历 2.2、中序遍历 2.3、后序遍历 1、前言 学习二叉树的三种非递归遍历前&#xff0c;首先来了解一下递归序&#xff1a; 递归序就是按照先序遍历的顺序&#xff0c;遇到的所有结点按顺序排列&#xff0c;重复的结点也必须记…

JavaScript 跨窗口通信(Cross-Window Communication)

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 在现代 Web 开发中&#xff0c;跨窗口通信是一种常见需求。它允许在…

怎么看待梅西?回家第一天,谢谢自己!新村主任!——早读

回家第一天 引言代码第一篇 平安中原 一图读懂 | 2024年全省公安局处长会议第二篇 人民日报 【夜读】这一年&#xff0c;谢谢自己第三篇 人民日报 来了&#xff01;新闻早班车要闻社会政策 结尾 引言 今天爬的很晚&#xff0c;没想到新闻早班车也排的那么低 回家第一天 昨天出去…

代码随想录算法训练营DAY16 | 二叉树 (3)

一、LeetCode 104 二叉树的最大深度 题目链接&#xff1a;104.二叉树的最大深度https://leetcode.cn/problems/maximum-depth-of-binary-tree/ 思路&#xff1a;采用后序遍历递归求解。 class Solution {int ans 0;public int maxDepth(TreeNode root) {if(root null){retur…

猫头虎分享已解决Bug ‍ || ValueError: Found array with dim 3. Estimator expected <= 2

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

嵌入式学习之Linux入门篇笔记——15,Linux编写第一个自己的命令

配套视频学习链接&#xff1a;http://【【北京迅为】嵌入式学习之Linux入门篇】 https://www.bilibili.com/video/BV1M7411m7wT/?p4&share_sourcecopy_web&vd_sourcea0ef2c4953d33a9260910aaea45eaec8 1.什么是命令&#xff1f; 命令就是可执行程序。 比如 ls -a…

armbian ddns

参考https://mp.weixin.qq.com/s/0Uu_nbGH_W6vAYHPH4kHqg Releases jeessy2/ddns-go GitHub mkdir -p /usr/local/ddns-go cd /usr/local/ddns-gowget https://github.com/jeessy2/ddns-go/releases/download/v6.1.1/ddns-go_6.1.1_freebsd_armv7.tar.gztar zxvf ddns-go_…

用友U8+OA doUpload.jsp 文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

mac电脑flutter环境配置,解决疑难问题

准备工作 首先搭建flutter的环境需要使用到flutter的sdk&#xff0c;可以直接跳去官网下载&#xff1a;Choose your first type of app - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter&#xff0c;下载时要注意你电脑所使用的芯片是Intel的还是苹果的芯片。 下载好的…

(C++)集合数据文件存储工具

前言 一个简单的实现简便 "map集合" 数据存储本地。 适合不会SQL但又想实现数据存储本地的同学。 操作使用都非常简单。 文件只做了简单的加密处理&#xff0c;如果需要复杂加密的同学可以修改加密函数。 项目结构 1.创建头文件——CAB.h // // Created by xw o…

【lesson47】进程通信之system V(共享内存)补充知识

文章目录 补充知识 补充知识 进行通信的key值问题&#xff0c;进程要通信的对方进程怎么能保证对方能看到&#xff0c;并且看到的就是该进程创建的共享内存的。 所以就通过key值来标识共享内存&#xff0c;key值是几不重要&#xff0c;只要在系统里是唯一的即可。 这样server和…

【动态规划】【前缀和】【数学】2338. 统计理想数组的数目

作者推荐 【动态规划】【前缀和】【C算法】LCP 57. 打地鼠 本文涉及知识点 动态规划汇总 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode:2338. 统计理想数组的数目 给你两个整数 n 和 maxValue &#xff0c;用于描述一个 理想…

React环境配置

1.安装Node.js Node.js官网&#xff1a;https://nodejs.org/en/ 下载之后按默认选项安装好 重启电脑即可自动完成配置 2.安装React 国内使用 npm 速度很慢&#xff0c;可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm。 ①使用 winR 输入 cmd 打开终端 ②依…