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

本章完。

相关推荐
new_zhou7 分钟前
C++ 项目 AI 协作指南(Windows / MSVC 环境)
c++·人工智能·windows
地平线开发者11 分钟前
征程6工具链模型X86推理方式说明
算法
地平线开发者15 分钟前
【征程6】校准量化中HistogramObserver解析
算法
蔬菜_41 分钟前
前端转全栈-day5(数组、list、set)
java·前端·数据结构·list
OuO-21 小时前
笔试强训 Day 34:ISBN 号码、kotori 和迷宫、矩阵最长递增路径
java·算法·矩阵
水饺编程2 小时前
AT&T 汇编语言学习笔记开篇语
c语言·汇编·c++
Iruoyaoxh2 小时前
类和对象~
开发语言·c++
程序喵大人2 小时前
【C++进阶】STL算法与函数对象 - 04 find、count和any_of把查询写成意图
开发语言·c++·算法
豆沙沙包?2 小时前
c++中引用(P7-P11)
java·c++·算法
wuminyu2 小时前
虚拟线程底层ForkJoinPool的工作窃取算法机制
java·linux·c语言·jvm·c++