【代码随想录 | Leetcode | 第八天】哈希表 | 有效的字母异位词 | 两个数组的交集 | 两数之和

文章介绍了使用哈希法解决LeetCode上的三个问题:判断两个字符串是否为字母异位词,找出两个数组的交集,以及寻找数组中和为目标值的两个数的索引。通过哈希表(unordered_set或数组)提高了查找效率,确保了算法的高效性。
摘要由CSDN通过智能技术生成

前言

欢迎来到小KLeetcode|代码随想录|专题化专栏,今天将为大家带来哈希法~有效的字母异位词 | 两个数组的交集 | 两数之和的分享


242. 有效的字母异位词

题目链接点这里
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例 1:

输入: s = “anagram”, t = “nagaram”
输出: true

示例 2:

输入: s = “rat”, t = “car”
输出: false

提示:

1 <= s.length, t.length <= 5 * 104
s 和 t 仅包含小写字母

思路

这道题目我们使用哈希法来求解,并且使用数组作为哈希表(字符串为小写字母并且它们的ASCII码值是连续的),所以我们直接定义一个大小为26的数组
如何映射?
就是如何把a-z映射到0-25,我们直接令当前值减去a就可以了
具体做法
把数组初始化为0,然后遍历字符串1,当该字符出现一次,对应位置的元素加一;同理遍历字符串2,当该字符串出现一次,对应位置的元素减一,如果最后该数组的元素还全部都是0,则说明字符串1和字符串2互为字母异位词,否则返回false

class Solution {
public:
    bool isAnagram(string s, string t) {
        int record[26] = {0};
        for (int i = 0; i < s.size(); i++) record[s[i]-'a']++;
        for (int j = 0; j < t.size(); j++) record[t[j]-'a']--;
        for (int k = 0; k < 26; k++) {
            if (record[k] != 0)
                return false;
        }
        return true;
    }
};

在这里插入图片描述


349. 两个数组的交集

题目链接点这里
给定两个数组 nums1nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000

【方法一】:使用unordered_set,把一个数组的值存入其中,再遍历第二个数组,在第一个数组中找第二个数组的值,如果找到,则插入到结果数组中

Tips:
C++ set find——函数用于查找具有给定值 val 的元素。如果找到元素,则返回指向该元素的迭代器,否则返回指向集合末尾的迭代器,即set :: end()。

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result;
        unordered_set<int> nums(nums1.begin(),nums1.end());
        for (int num : nums2) {
            if (nums.find(num) != nums.end()) {
                result.insert(num);
            }
        }
        return vector<int>(result.begin(),result.end());
    }
};

在这里插入图片描述
【方法二】:使用数组作为哈希表,因为这里的数组长度在1000以内

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        int hashTable[1005] = {0};
        unordered_set<int> result;
        for (int a : nums1) hashTable[a] = 1;
        for (int b : nums2) {
            if (hashTable[b] == 1) {
                result.insert(b);
            }
        }
        return vector<int>(result.begin(),result.end());
    }
};

在这里插入图片描述


1. 两数之和

题目链接点这里
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案

【方法一】:暴力,两层for循环直接干

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

在这里插入图片描述

【方法二】:哈希法

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int> map;
        for (int i = 0; i < nums.size(); i++) {
            auto iter = map.find(target - nums[i]);
            if (iter != map.end()){
                return {iter->second,i};
            }
            map.insert(pair<int, int>(nums[i], i));
        }
        return {};
    }
};

在这里插入图片描述

总结

需要快速判断一个元素是否出现在集合中时,考虑哈希~~
在这里插入图片描述
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaok-cpp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值