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

【算法专题十】哈希表

文章目录

  • 0.哈希表简介
  • 1. 两数之和
    • 1.1 题目
    • 1.2 思路
    • 1.3 代码
  • 2.判断是否为字符重排
    • 2.1 题目
    • 2.2 思路
    • 2.3 代码
  • 3. leetcode.217.存在重复元素
    • 3.1 题目
    • 3.2 思路
    • 3.3 代码
  • 4. leetcode.219.存在重复的元素Ⅱ
    • 4.1 题目
    • 4.2 思路
    • 4.3 代码
  • 5. leetcode.49.字母异位词分组
    • 5.1 题目
    • 5.2 思路
    • 5.3 代码

0.哈希表简介

在这里插入图片描述

1. 两数之和

1.1 题目

题目链接
在这里插入图片描述在这里插入图片描述

1.2 思路

在这里插入图片描述

1.3 代码

// 法1.1 
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {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 {};}
};
// 法1.2 
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {int n = nums.size();for(int i = 1; i < n; i++){for(int j = 0; j < i; j++){if(nums[i] + nums[j] == target) return {i, j};}}return {};}
};
// 法2
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> idx; // 创建一个空哈希表for(int j = 0; ; j++){auto it = idx.find(target - nums[j]);if(it != idx.end())return {it->second, j};idx[nums[j]] = j;}}
};
// 法2的另一种写法
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> hash;for(int i = 0; i < nums.size(); i++){int t = target - nums[i];if(hash.count(t)) return {hash[t], i};hash[nums[i]] = i;}return {};}
};

2.判断是否为字符重排

2.1 题目

题目链接
在这里插入图片描述

2.2 思路

在这里插入图片描述

2.3 代码

class Solution {
public:bool CheckPermutation(string s1, string s2) {if(s1.size() != s2.size()) return false;int hash[26] = {0};for(auto it1 : s1){hash[it1 - 'a'] ++;}for(auto it2 : s2){hash[it2 - 'a'] --;if(hash[it2 - 'a'] < 0) return false;}return true;}
};

3. leetcode.217.存在重复元素

3.1 题目

题目链接
在这里插入图片描述
在这里插入图片描述

3.2 思路

在这里插入图片描述
这个题思路跟上一个题的思路有点像,使用哈希表,从前往后遍历,从1开始遍历,判断哈希表中时候有此时的值,没有的话,把现在的值插入哈希表中,然后遍历下一个位置。

3.3 代码

class Solution {
public:bool containsDuplicate(vector<int>& nums) {unordered_set<int> hash;for(auto x : nums){if(hash.count(x)) return true;else hash.insert(x);}return false;}
};

4. leetcode.219.存在重复的元素Ⅱ

4.1 题目

题目链接
在这里插入图片描述
在这里插入图片描述

4.2 思路

在这里插入图片描述
在这里插入图片描述

4.3 代码

// 法一 两层循环遍历
class Solution {
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {for(int i = 0; i < nums.size(); i++){for(int j = i + 1; j <= i + k && j < nums.size(); j++){if(nums[i] == nums[j])return true;}}return false;}
};
// 法二 哈希表
class Solution {
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {unordered_map<int, int> hash;for(int i = 0; i < nums.size(); i++){if(hash.count(nums[i])){if(i - hash[nums[i]] <= k) return true;}  hash[nums[i]] = i;}return false;}
};

5. leetcode.49.字母异位词分组

5.1 题目

题目链接
在这里插入图片描述

5.2 思路

在这里插入图片描述
在这里插入图片描述

5.3 代码

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string, vector<string>> hash;// 1. 把所有的字母异位词分组for(auto s : strs){string tmp = s;sort(tmp.begin(), tmp.end());hash[tmp].push_back(s);}// 2. 把结果提取出来vector<vector<string>> ret;for(auto& [x, y] : hash){ret.push_back(y);}return ret;}
};
http://www.xdnf.cn/news/4362.html

相关文章:

  • 生命游戏(中等)
  • uDistil-Whisper:低数据场景下基于无标签数据过滤的知识蒸馏方法
  • 【技术追踪】通过潜在扩散和先验知识增强时空疾病进展模型(MICCAI-2024)
  • 「Mac畅玩AIGC与多模态22」开发篇18 - 多段输出拼接与格式化展现工作流示例
  • 融智学视角集大成范式革命:文理工三类AI与网络大数据的赋能
  • 低版本GUI配置SAProuter
  • BBS (cute): 1.0.2靶场渗透
  • IDEA 安装 SpotBugs 插件超简单教程
  • SSH服务/跳板机
  • 嵌入式开发学习日志Day14
  • LeetCode 解题思路 45(分割等和子集、最长有效括号)
  • Messenger.Default.Send 所有重载参数说明
  • 星纪魅族新品发布会定档5月13日,Note 16系列战神归来
  • 【5G通信】天线调整
  • 笔记系统的价值
  • 【C++】基础语法
  • 微调大模型如何准备数据集——常用数据集,Alpaca和ShareGPT
  • 学习groovy知识点总结
  • TCP数据报
  • B2134 质数的和与积
  • 新品发布 | 用于诊断开发的多通道MC800车辆通信卡
  • 油价查询开发指南:多源校验+成本预测模型(含等保二级合规方案)
  • 【HarmonyOS 5】鸿蒙发展历程
  • STM32F4 PWM 配置程序
  • 426、N叉树的层序遍历
  • var、let、const三者之间的区别和使用
  • WiFi那些事儿(七)——802.11速率表
  • Hybrid接口配置与应用指南
  • Webug4.0靶场通关笔记17- 第21关文件上传(htaccess)
  • Leetcode 刷题记录 08 —— 链表第二弹