刷题20240115

文章介绍了如何使用哈希表(如vector和unordered_set)以及STL(如unordered_map和迭代器)解决四个编程问题:字母异位词判断、两个数组的交集、快乐数检测和两数之和。重点强调了哈希表的高效性和STL函数find的应用.
摘要由CSDN通过智能技术生成

242. 有效的字母异位词

比较简单的哈希表,用数组记录,每个字母出现1次,就在对应的字母位数+1,最后统计两个数组是否相同即可。

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

349. 两个数组的交集

std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。

这个题的注释写的很详细,重新回顾下STL迭代器的用法,很巧妙

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重
        unordered_set<int> nums_set(nums1.begin(), nums1.end()); //对nums1进行去重
        for (int num : nums2) {
            if (nums_set.find(num) != nums_set.end()) result_set.insert(num);
            /* 
                find函数,返回该元素所在位置的指针,如果没有该元素,返回end
                nums2中的元素依次再nums1的去重集合中查找
                如果nums1中有该元素,则说明为交集,进入result集合中
            */
        }
        return vector<int> (result_set.begin(), result_set.end());
    }
};

202. 快乐数

这题我是真不快乐啊,想到了用上一道题unordered_set来记录每次进入的数据,一旦查到该数据在set中已经存在,则代表已经进入无限循环,即该数不是“快乐数”。

题目的另一个难点是如何把这个数进行变化(感觉这是难点),通过取余和除10来进行操作。

class Solution {
public:
    // 本题关键,如何将各个位平方并加和
    int getSum(int n) {
        int sum = 0;
        while (n) {
            sum += (n % 10) * (n % 10);
            n = n / 10;
        }
        return sum;
    }
    bool isHappy(int n) {
        unordered_set<int> result;
        while (1) {
            int sum = getSum(n);
            if (sum == 1) return true;
            else {
                if (result.find(sum) != result.end()){
                    return false;
                }
                else result.insert(sum);
            }
            n = sum;
        }
    }
};

1. 两数之和

使用unordered_map,键值对分别为数组元素和对应下标

插入数据时,在map中寻找与之求和为目标数的数组元素,如果找到,返回两个数的下标,如果没有,将刚插入的数据与其元素下标加入map中。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        std::unordered_map <int,int> map;
        for(int i = 0; i < nums.size(); i++) {
            // 遍历当前元素,并在map中寻找是否有匹配的key
            auto iter = map.find(target - nums[i]); 
            if(iter != map.end()) {
                return {iter->second, i};
            }
            // 如果没找到匹配对,就把访问过的元素和下标加入到map中
            map.insert(pair<int, int>(nums[i], i)); 
        }
        return {};
    }
};

哈希表的题目都很巧妙,关于STL map和set的用处掌握的还是不够熟练

加深对find函数的使用理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值