《算法题讲解指南:优选算法-哈希表》--56.两数之和,57.判断是否互为字符重排

🔥小叶-duck个人主页

❄️个人专栏《Data-Structure-Learning》《C++入门到进阶&自我学习过程记录》
《算法题讲解指南》--优选算法
《算法题讲解指南》--递归、搜索与回溯算法
《算法题讲解指南》--动态规划算法

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

哈希表简介:

56.两数之和

题目链接:

题目描述:

题目示例:

解法(哈希表):

算法思路:

C++算法代码(暴力枚举):

C++算法代码(哈希表):

算法总结及流程解析:

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

题目链接:

题目描述:

题目示例:

解法(哈希表):

算法思路:

C++算法代码(两个哈希表):

C++算法代码(优化:一个哈希表):

算法总结及流程解析:

结束语


哈希表简介:

56.两数之和

题目链接:

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

题目描述:

题目示例:

解法(哈希表):

算法思路:

如果我们可以事先将「数组内的元素」和「下标」绑定在一起存入「哈希表」中,然后直接在哈希表中查找每一个元素的target-numsi,就能快速的找到「目标和的下标」。

这里有一个小技巧,我们可以不用将元素全部放入到哈希表之后,再来二次遍历(因为要处理元素、相同的情况)。而是在将元素放入到哈希表中的「同时」,直接来检查表中是否已经存在当前元素所对应的目标元素(即target-numsi)。如果它存在,那我们已经找到了对应解,并立即将其返回。无需将元素全部放入哈希表中,提高效率。

因为哈希表中查找元素的时间复杂度是0(1),遍历一遍数组的时间复杂度为0(N),因此可以

将时间复杂度降到 O(N)。

这是一个典型的「用空间交换时间」的方式。

C++算法代码(暴力枚举):

cpp 复制代码
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) 
    {
        //解法一:暴力枚举(时间复杂度:O(N^2) )
        int n = nums.size();
        for(int i = 0; i < n; i++)
        {
            for(int j = i + 1; j < n; j++)
            {
                if(nums[i] + nums[j] == target)
                {
                    return {i, j};
                }
            }
        }
        return {};
    }
};

C++算法代码(哈希表):

cpp 复制代码
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) 
    {
        //解法二:哈希表
        int n = nums.size();
        unordered_map<int, int> hash; //<nums[i], i>
        //将数组每个值放入哈希表中,并且对应的值(value)是下标
        for(int i = 0; i < n; i++)
        {
            if(hash.count(target - nums[i]))
            {
                return {hash[target - nums[i]], i};
                //hash[target - nums[i]]对应的就是前面一个值的下标
            }
            else
            {
                //为0则说明前面没有值和nums[i]相加为target
                //则插入哈希表
                hash[nums[i]] = i;
            }
        }
        return {};
    }
};

算法总结及流程解析:

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

题目链接:

面试题 01.02. 判定是否互为字符重排 - 力扣(LeetCode)

题目描述:

题目示例:

解法(哈希表):

算法思路:

1.当两个字符串的长度不相等的时候,是不可能构成互相重排的,直接返回 false;

2.如果两个字符串能够构成互相重排,那么每个字符串中「各个字符」出现的「次数」一定是相同的。因此,我们可以分别统计出这两个字符串中各个字符出现的次数,然后逐个比较是否相等即可。这样的话,我们就可以选择「哈希表」来统计字符串中字符出现的次数。

C++算法代码(两个哈希表):

cpp 复制代码
class Solution {
public:
    bool CheckPermutation(string s1, string s2) 
    {
        //解法:两个哈希表
        int hash1[26] = {0};
        int hash2[26] = {0};    
        for(int i = 0; i < s1.size(); i++)
        {
            hash1[s1[i] - 'a']++;
        }
        for(int i = 0; i < s2.size(); i++)
        {
            hash2[s2[i] - 'a']++;
        }
        for(int i = 0; i < 26; i++)
        {
            if(hash1[i] != hash2[i])
            {
                return false;
            }
        }
        return true;
    }
};

C++算法代码(优化:一个哈希表):

cpp 复制代码
class Solution {
public:
    bool CheckPermutation(string s1, string s2) 
    {
        //优化:一个哈希表
        if(s1.size() != s2.size())
        {
            return false;
        }
        int hash[26] = {0};
        for(int i = 0; i < s1.size(); i++)
        {
            hash[s1[i] - 'a']++;
        }
        for(int i = 0; i < s2.size(); i++)
        {
            hash[s2[i] - 'a']--;
        }
        for(int i = 0; i < 26; i++)
        {
            if(hash[i] != 0)
            {
                return false;
            }
        }
        return true;
    }
};

算法总结及流程解析:

结束语

到此,56.两数之和,57.判断是否互为字符重排 这两道算法题就讲解完了。两数之和,对比了暴力枚举(O(n²))和哈希表(O(n))两种解法,后者通过空间换时间优化效率;判断是否互为字符重排,通过统计字符出现次数进行比较,提供了使用两个哈希表和优化为一个哈希表的两种实现方式。希望大家能有所收获!

相关推荐
NiceCloud喜云14 小时前
Opus 4.8 的 Effort Control 怎么选:Low 到 Max 五档策略
android·java·大数据·前端·c++·python·spring
小羊在睡觉14 小时前
力扣84. 柱状图中最大的矩形
后端·算法·leetcode·golang·go
cjhbachelor15 小时前
c++继承
c++
3DVisionary15 小时前
蓝光三维扫描:医疗制造的精度焦虑怎么解
人工智能·算法·制造·蓝光三维扫描·医疗制造·三维检测·义齿检测
好评笔记15 小时前
机器学习面试八股——常用损失函数
人工智能·深度学习·算法·机器学习·校招
weixin_4684668515 小时前
全局与局部注意力机制新手实战指南
人工智能·python·深度学习·算法·自然语言处理·transformer·注意力机制
肩上风骋15 小时前
C++14特性
开发语言·c++·c++14特性
_日拱一卒15 小时前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先
珂朵莉MM16 小时前
第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第3赛季优化题--束搜索
人工智能·算法
Omics Pro17 小时前
首个!外源天然产物综合性代谢图谱
数据库·人工智能·算法·机器学习·r语言