代码随想录算法训练营第五天|242. 有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

本文介绍了四种与IT技术相关的编程题目,包括字母异位词的哈希表计数法、数组交集的unordered_set处理、快乐数的哈希表检测和两数之和的unordered_map查找,展示了哈希表在这些问题中的应用及其时间复杂度分析。
摘要由CSDN通过智能技术生成

242. 有效的字母异位词
算法思路:采用哈希表的数组方法,先定义一个record用来记录s中字母出现的次数,把字符映射到哈希表的索引下表,例如将a映射到0,z映射到25,再遍历s,只需要将s[i] - 'a’做+1操作即可。检查t中的字符映射到哈希表中做-1操作。最后看record中是否为0,为0就是有效的字母异位词。

class Solution {
public:
    bool isAnagram(string s, string t) {
        int record[26] = {0};  // 记录每个字母出现的次数

        for (int i = 0; i < s.size(); i++) {  // 遍历s找到s中字母出现的次数
            record[s[i] - 'a']++;  
        }
 
        for (int j = 0; j < t.size(); j++) {
            record[t[j] - 'a']--;
        }
        
        for (int k = 0; k < 26; k++) {
            if (record[k] != 0) 
                return false;
        }
        return true;
    }
};

时间复杂度:O(n)

349. 两个数组的交集

思路: 本题采用哈希表的set数据结构,set有三种数据结构,
std::set
std::multiset
std::unordered_set
multiset是可重复的,而unordered_set是去重的
首先定义一个unordered_set类型的result存放结果,可去重,将nums索引到哈希表中,遍历nums2,找到与哈希表中元素相同的插入到哈希表中。最后将结果转为数组

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result_set;  // unordered_set给结果resutlt去重
        unordered_set<int> nums_set(nums1.begin(), nums1.end());  // 将nums1中的元素索引到哈希表
        for (int i = 0; i < nums2.size(); i++) {
            if (nums_set.find(nums2[i]) != nums_set.end())
                result_set.insert(nums2[i]);
        }

        return vector<int>(result_set.begin(), result_set.end());

    }
};

202. 快乐数

//  O(logn)
//  思路: 当快速查找一个元素是否在集合里时,使用哈希表法。 判断sum是否重复则采用unordered_set。求和过程需要取各位上的值
class Solution {
public:

    int getSum (int n) {
        int sum = 0;
        while (n != 0) {  // 取各个位上的单数
            sum += (n % 10) * (n % 10);
            n /= 10;
        }
        return sum;
    }
    bool isHappy(int n) {
        unordered_set<int> set;
        while (1) {  // 无限循环语句,意思是无论条件如何,循环会一直执行下去。条件部分为1,而1代表真(非零),所以这个循环将一直执行
            int sum = getSum(n);
            if (sum == 1) {   // 若sum=1 说明n是快乐数
                return true;
            }
            if (set.find(sum) != set.end()) {  // 若sum曾经出现过,则说明死循环了
                return false;
            } else {
                set.insert(sum);
            }
            n = sum;
        }
    }
};

1. 两数之和

// O(n)
// 思路: 当需要查询一个元素是否在集合里就用哈希法。本题需要用一个集合来存放遍历过的元素,然后遍历数组去查找询问这个集合,找到后返回值和下标
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        std::unordered_map<int,int> map;  // 定义一个unordered_map容器用于存放访问过的元素
        for (int i = 0; i < nums.size(); i++) {  // 遍历数组
            auto iter = map.find(target - nums[i]);  // 再哈希表中寻找匹配项key值
            if (iter != map.end()) {
                return {iter->second, i};  // 返回值和下标
            }
            map.insert(pair<int,int>(nums[i], i));  // 如果没有找到合适的匹配项,就把访问过的元素加入到map容器中
        }
        return {};
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值