## 算法记录Day 6 | 哈希表part01

100 阅读3分钟

算法记录Day 6 | 哈希表part01

LeetCode 242-有效的字母异位词

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

输入: s = "anagram", t = "nagaram"
输出: true

题目链接:leetcode.cn/problems/va…

题解
class Solution {
   public:
    bool isAnagram(string s, string t) {
        unordered_map<char, int> countMap;
        for (char c : s) {
            countMap[c] += 1;
        }
        for (char c : t) {
            countMap[c] -= 1;
        }
        for (auto &t : countMap) {
            if (t.second != 0) {
                return false;
            }
        }
        return true;
    }
};
解题思路

使用hsahmap做计数器,最后遍历计数器的值是不是为0.

LeetCode 349-两个数组的交集

题目描述:给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

题目链接:leetcode.cn/problems/in…

输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
题解
class Solution {
   public:
    vector<int> intersection(vector<int> &nums1, vector<int> &nums2) {
        set<int> numSet;
        set<int> resSet;
        vector<int> res;
        for (auto n : nums1) {
            numSet.insert(n);
        }
        for (auto n : nums2) {
            if (numSet.count(n) != 0) {
                resSet.insert(n);
            }
        }

        for (auto &e : resSet) {
            res.push_back(e);
        }
        return res;
    }
};
解题思路

两个集合计算交集。

LeetCode 202-快乐数

题目描述:编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

题目链接:leetcode.cn/problems/ha…

输入: n = 19
输出: true
解释: 12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
题解
class Solution {
   public:
    bool isHappy(int n) {
        unordered_set<int> sumSet;
        size_t maxN = pow(2, 31) - 1;
        while (true) {
            int sum = getSum(n);
            if (sum == 1) {
                return true;
            }
            if (sum > maxN) {
                return false;
            }
            if (sumSet.find(sum) != sumSet.end()) {
                return false;
            } else {
                sumSet.insert(sum);
            }
            n = sum;
        }
    }
    int getSum(int n) {
        /*先求模获得最右边的数字,然后/10,移除最低位*/
        int sum = 0;
        while (n != 0) {
            sum += (n % 10) * (n % 10);
            n = n / 10;
        }
        return sum;
    }
};
解题思路

第一次做的时候在遍历n,看了题解后知道可以通过先取模获得数字的最低位,然后除以10消除最小的一位数。从而从低位到高位遍历数字。同时用一个set记录所有出现过的sum,如果重复说明陷入了循环。

LeetCode 1-两数之和

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

题目链接:leetcode.cn/problems/tw…

输入: nums = [2,7,11,15], target = 9
输出: [0,1]
解释: 因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
题解
class Solution {
   public:
    vector<int> twoSum(vector<int> &nums, int target) {
        unordered_map<int, int> map;
        vector<int> res;
        for (int i = 0; i < nums.size(); i++) {
            auto iter = map.find(target - nums[i]);
            if (iter != map.end()) {
                res.push_back(iter->second);
                res.push_back(i);
                return res;
            } else {
                map.insert(pair<int, int>(nums[i], i));
            }
        }
        return res;
    }
};
解题思路

c++的hashmap使用跟go的差异比较大,需要使用unordered_map.find()返回一个迭代器iter, 它有两个属性:first返回key,second返回value。insert()方法需要插入一个pair<int,int>类型的数据结构。

if (got == mymap.end()) {// 元素不存在}