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;
    }
};

本章完。

相关推荐
yi0114 分钟前
LeetCode 643. 子数组最大平均数 I|从暴力枚举到滑动窗口
人工智能·笔记·python·算法·leetcode·滑动窗口
无忧.芙桃27 分钟前
C++语言原理与实践(十二):list类的底层实现
c++·windows·list
沫璃染墨29 分钟前
《Linux工程实践篇(二):线程池实战——从线程安全单例到完整源码实现》
linux·开发语言·c++·单例模式·设计模式·系统架构
极光通讯35 分钟前
服务器内存来料检验(IQC)实操:批次追溯、外观判定与上机验证
java·服务器·算法
淡海水1 小时前
02-04-原理篇-GC Roots与对象图遍历
算法·unity·c#·图·gc·遍历·roots
ClickHouseDB1 小时前
ClickHouse 大规模 OpenTelemetry 数据接入架构的可靠性演进
算法
有只小白叫岳飒1 小时前
c++智能指针 unique_ptr与函数调用
c++
Shaoshing1 小时前
BHU 润石工作室 251019自建赛题解
算法
Leo.yuan1 小时前
Kafka+Flink拼凑,还是FineDataLink 5.0一体化?实时数据处理的两种思路
c++·mfc
玩AI的奶茶1 小时前
24GB 显存能跑多大的模型?参数量、精度与显存占用对照表
人工智能·python·算法·ai·aigc·gpu算力·算力租赁