C++算法:哈希表(简介|两数之和|判断是否互为字符重排)

上篇文章:力扣题型--链表(合并K个升序链表|K个一组翻转链表)

目录

1.哈希表简介

1.1哈希表是什么

1.2作用

1.3什么时候用

1.4怎么用

2.两数之和

算法原理

解法一:暴力解法

解法二:哈希表

3.判断是否互为字符重排

算法原理


1.哈希表简介

1.1哈希表是什么

存储数据的容器

1.2作用

"快速"查找某个元素(O(1)时间复杂度)

1.3什么时候用

频繁的查找某一个数时(也可以想到二分)

1.4怎么用

  1. 容器(哈希表)
  2. 用数组模拟简易哈希表:
    1. 查找字符串中的"字符"
    2. 数据范围很小时

2.两数之和

https://leetcode.cn/problems/two-sum/description/

算法原理

解法一:暴力解法

固定一个数,使其与它之前的数相加

cpp 复制代码
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int sum = 0;
        for(int i = 0; i < nums.size(); i++)
        {
            for(int j = 0; j < i; j++)
            {
                sum = nums[i] + nums[j];
                if(sum == target) return{j, i};
            }
        }
        return { };
    }
};

解法二:哈希表

优化前面的"和之前的数相加",其完美适配哈希表"边遍历,边存储"的特性,并且可以规避"用同一个元素"的坑,匹配永远是j < i,绝不会用到自己numsi。

cpp 复制代码
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 need = target - nums[i];
            if(hash.find(need) != hash.end()) // hash.end()是"不存在标记"
            {
                return {hash[need], i};
            }

            hash[nums[i]] = i; // 值与下标绑定
        }
        return {};
    }
};

3.判断是否互为字符重排

https://leetcode.cn/problems/check-permutation-lcci/description/

算法原理

利用哈希表,但不使用hash<char, int>,因为每次查找都需要遍历一遍原字符串,我们使用数组模拟哈希表,使用两个哈希表,然后判断其出现的次数即可。

优化:只使用一个哈希表

使用一个哈希表进行计数,再判断时遇到相同的字符,其数值-1。

边界情况:若两字符串长度不同,直接返回false。

cpp 复制代码
class Solution {
public:
    bool CheckPermutation(string s1, string s2) {
        if(s1.size() != s2.size()) return false;

        int hash[26] = { 0 };
        for(auto s : s1)
        {
            hash[s - 'a']++;
        }

        for(auto s : s2)
        {
            hash[s - 'a']--;
            if(hash[s - 'a'] < 0) return false;
        }
        return true;
    }
};

本章完。

相关推荐
m0_639906946 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
Sakura_j_h_6 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
ZhengEnCi7 小时前
Agent 架构怎么选:从单 Agent 到多 Agent 编排的选型决策指南
算法·架构
程序喵大人7 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
秋天的怀念_David7 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Pniubi8 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展
hhb_6188 小时前
大模型落地三重优化实战
人工智能·算法·机器学习
云和数据.ChenGuang8 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain
jimy19 小时前
C++ 中的 `T&&`:右值引用与转发引用
开发语言·c++
2601_9707038310 小时前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法