代码随想录-哈希表01 242.有效的字母异位词&349. 两个数组的交集&1. 两数之和

242.有效的字母异位词

242.有效的字母异位词
分析:题目要求判断字符串 t 是否是 s 的字母异位词,本题的暴力解法是排序两个字符串,然后对比是否一样,但是这样的时间复杂度是 O(nlogn)。
更高效的解法是利用哈希表,记录字符串t每个字符出现的次数,然后遍历s判断,时间复杂度是O(2
n),空间复杂度是O(N),利用到了哈希表。
当然因为题目有说明字符串类型都是英文字母且是小写,那么可以确定数据key范围,那么更好的选择是使用数组来做记录,会比map高效,因为map使用的是红黑树。

// map insert 是需要pair参数的 忘记了
// map的遍历也忘记了
bool isSameCharaters(string s, string t)
{
    map tmpMap;
    for (int i = 0; i < s.size(); ++i) {
        if (tmpMap.find(s[i]) != tmpMap.end()) {
            tmpMap[s[i]]++;
        } else {
//            tmpMap.insert(pair(s1[i], 1));
            tmpMap[s[i]] = 1;
        }
    }

    for (int i = 0; i < t.size(); i++) {
        if (tmpMap.find(t[i]) == tmpMap.end())
            return false;
        tmpMap[t[i]]--;
    }
    for (auto it = tmpMap.begin(); it != tmpMap.end(); ++it) {
        if (it->second != 0) return false;
    }
    return true;
}

349. 两个数组的交集

349. 两个数组的交集
分析过程:
本题要求是给定两个数组,编写一个函数来计算它们的交集。
因为题目要求返回不重复结果也不要求顺序,也就是需要对结果去重,那么这题的更好选择是unordered_set,底层的实现是哈希表。

// 思路定义一个tmpMap,记录nums1中数字类型及出现个数,然后遍历nums2,
// 如果nums中的数字出现在tmpMap内,则添加到ret内
// 需要注意 vector没有append
// 使用 可以使用unordered_set来去除重复,unordered_set效率比map高
// 标准容器的高效用法需要熟悉
vector getSameSubDiffArray(vector nums1, vector nums2)
{
    unordered_set ret;
//    vector ret;
    unordered_set tmpMap(nums1.begin(), nums1.end());
    for (int i = 0; i < nums2.size(); ++i) {
        if (tmpMap.find(nums2[i]) != tmpMap.end())
            ret.insert(nums2[i]);
    }
    return vector (ret.begin(), ret.end());
}

202. 快乐数

1. 两数之和

1. 两数之和
题目要求计算两个数之和,也是利用哈希表来解决,降低时间复杂度到O(n)。

这里暴力遍历法也给出来了,思路使用index遍历一遍数组,在index之后的数据里查找target - nums[index]。思路的时间复杂度O(n^2)

vector getSumIndexArray(vector nums, int target)
{
    vector ret;
    for (int  i = 0; i < nums.size(); ++i) {
        int j = i + 1;
        while (j < nums.size()) {
            if (target - nums[i] == nums[j]) {
                ret.push_back(i);
                ret.push_back(j);
                return ret;
            }
            j++;
        }
    }
    return ret;
}

使用哈希表的解法如下所示。

vector getSumIndexArray2(vector nums, int target)
{
    map tmpMap; // [value, index]

    for (int i = 0; i < nums.size(); ++i) {
        if (tmpMap.find(target - nums[i]) != tmpMap.end()) {
            return vector {tmpMap[target - nums[i]], i};
        }
        else
            tmpMap[nums[i]] = i;
    }
    return vector();
}

总结

今天使用到的主要思维是使用哈希表来解题,可以降低算法的时间复杂度。
在使用C++容器过程中发现对容器了解不多,基本使用如 初始化、Insert等基础操作不熟悉。
哈希表是个宽泛概念,之前我狭义理解为map,但其实还有set、数组等。

你可能感兴趣的:(散列表,数据结构)