代码随想录算法训练营第六天|第三章 哈希表part01

理论基础:

能用来干什么? 哈希表都是用来快速判断一个元素是否出现在集合里.

涉及到的哈希函数 哈希碰撞 线性探测法和拉链法 待后续用到时深入理解

常见的哈希结构:数组  集合set  映射map

242.有效的字母异位词 :有效的字母异位词

思考:

就是希望这两个字符串出现的字符数量及种类都相同,怎样快速判断? 26个英文字母是有限的,直接比较这两个字符串中不同字母的出现次数即可;

字母顺序用0-26,比较出现次数可以用加减法实现,即一个字符串++,另一个字符串--,最后看总体的记录结果是怎样.

    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 i = 0; i < 26; i++) {
            if(record[i] != 0) return false;
        }

        return true;
    }

 349. 两个数组的交集 :两个数组的交集

由于是前期不是很了解,本次是参照得出的,因此只将学到的知识点记录下来.

整体思路,将一个数组转换为哈希表,遍历另一个数组,并将两者进行判断(find函数),如果能够在哈希表中找到,则说明存在交际,即存储起来.

又因交集中无重复结果,并且unordered_set读写效率最高,因此选择该数据结构

    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result_set;
        unordered_set<int> nums1_set(nums1.begin(), nums1.end());
        for(int num : nums2) {
            if(nums1_set.find(num) != nums1_set.end()) {
                result_set.insert(num);
            }
        }
        return vector<int>(result_set.begin(), result_set.end());

 202. 快乐数:快乐数

根据题目要求,需要进行求和操作; 另外就是一个循环结构,即(求和->判断是否为1(true 结束),(不唯一则要判断是否陷入循环,或者继续求和))

本次的哈希表即运用在判断是否重复上面,.记录下每个不为1的结果,并提供下一次的判断;

    int getSum (int a) {
        int sum = 0;
        while (a) {
            sum += (a % 10) * (a % 10);
            a /= 10;
        }
        return sum;        
    }
    bool isHappy(int n) {
        unordered_set<int> record;
        while(n) {
            int temp = getSum(n);
            if(temp == 1) {
                return true;
            } else if(record.find(temp) != record.end()) {
                break;
            }else {
                record.insert(temp);
            }
            n = temp;
        }
        return false;

    }

 1. 两数之和 :两数之和

思路:

判断是否有满足要求的两个加数,将求和转换为求差,即target 与 nums[i] 做差进行计算,然后判断是由有满足条件的已经在里面了

要求返回下标,应该采用key - value的组合,即map

 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 {};
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值