【c++】代码随想录算法训练营day6 | 242. 两两交换链表中的节点 ● 349. 两个数组的交集● 1. 两数之和 【附注释:踩的坑

87 阅读2分钟

242. 有效的字母异位词(数组的使用案例)

image.png

哈希表一共有三种:数组、集合set、映射map

哈希使适用:需要找到某一个值

public:
    bool isAnagram(string s, string t) {
        int hash[26]={0}; //一定要初始化,局部变量不初始化,会默认随机值,影响最后的 if(hash[i]!=0)判断
        for(int i=0; i<s.size();i++){
            hash[s[i] - 'a']++;
        }
        for(int i=0; i<t.size();i++){
            hash[t[i] - 'a']--;
        }
        for(int i=0; i<26;i++){
            if(hash[i]!=0){
                return false;
            }
           
        }
     return true;
    }
};

补充知识:

c328df8ffe2b4ea94522fc3dcf57b4b.jpg

349. 两个数组的交集(set的使用案例)

image.png

思路

public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result_set;
        unordered_set<int> nums_set(nums2.begin(),nums2.end());  //此时result_set: {[0] = 2},因为set有自动去重功能
        for(int num : nums1){
            if(nums_set.find(num) != nums_set.end()){
                result_set.insert(num);
            }
        }
    return vector<int>(result_set.begin(), result_set.end());
    }
};

提问:

那有同学可能问了,遇到哈希问题我直接都用set不就得了,用什么数组啊。

直接使用set 不仅占用空间比数组大,而且速度要比数组慢,set把数值映射到key上都要做hash计算的。

不要小瞧 这个耗时,在数据量大的情况,差距是很明显的

1. 两数之和(map的使用案例)

什么时候需要用哈希法?判断一个元素是否遍历过,或者一个元素是否在集合里的时候。 map何时使用?不仅要知道这个元素还要知道它的下标。

map是用来存放遍历过的元素 ,key存放的是元素,value存放的是下标。

这道题目中并不需要key有序,选择std::unordered_map 效率更高!

if(iter != map.end())是什么意思? 当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器

public:
    vector<int> twoSum(vector<int>& nums, int target) {
        std::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};  //返回两个数的下标,iter->second是map.value
            }
            map.insert(pair<int, int>(nums[i], i));  //pair<int, int>pair是C++中一种模板类型。每个pair对象可以存储两个值,这两个值可以是不同的数据类型。
        }
    return {};
    }
};