代码随想录算法训练营Day5(LeetCode242 有效的字母异位词;LeetCode349 两个数组的交集;LeetCode202 快乐数 ;LeetCode1 两数之和)

代码随想录算法训练营Day5(LeetCode242 有效的字母异位词;LeetCode349 两个数组的交集;LeetCode202 快乐数 ;LeetCode1 两数之和)


;LeetCode1 两数之和))

LeetCode242 有效的字母异位词

题目链接:有效的字母异位词(https://leetcode.cn/problems/valid-anagram/description/)
文档讲解:代码随想录(https://programmercarl.com)

做题情况

这道题没想过可以用哈希表做,现在仔细思考一下题目,它其实就是判断s中的每一个元素是否在t中,因此就可以想到哈希表。由于只有小写字母,因此可以通过ASCII码构成一个天然映射,将 ‘a’‘z’ 映射到 0-25 ,等同于 ordered_set

下面是代码:

bool isAnagram(string s, string t) {
    int hashArray[26] = {0};
    for (int i = 0; i < s.size(); i++) {
        hashArray[s[i] - 'a']++;
    }
    for (int i = 0; i < t.size(); i++) {
        hashArray[t[i] - 'a']--;
    }
    for (int i = 0; i < 26; i++) {
        if (hashArray[i] != 0) {
            return false;
        }
    }
    return true;
}

LeetCode349 两个数组的交集

题目链接:两个数组的交集(https://leetcode.cn/problems/intersection-of-two-arrays/)
文档讲解:代码随想录(https://programmercarl.com)

做题情况

这道题使用数组的话,就是通过id映射,在 [0, 1000] 的范围限制内还是可以求解的,但是再大一些就会造成大量的空间浪费。这里直接使用 unordered_set ,通过这道题初步了解了 set 的一般用法。

下面是代码:

vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
    unordered_set<int> res_set;
    unordered_set<int> nums1_set(nums1.begin(), nums1.end());

    for (int num : nums2) {
        if (nums1_set.find(num) != nums1_set.end()) {
            res_set.insert(num);
        }
    }

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

LeetCode202 快乐数

题目链接:快乐数(https://leetcode.cn/problems/happy-number/description/)
文档讲解:代码随想录(https://programmercarl.com)

做题情况

这道题直接用 unorderset 就能求解了,因为最后就是判断为1就返回 True ,为原始数n就返回 False。注意各个位置数字平方和的写法就好了。

以下是代码:

bool isHappy(int n) {
    unordered_set<int> num_set;
    while (n != 1) {
        if (num_set.find(n) != num_set.end()) return false;
        num_set.insert(n);
        int tmp = 0;
        while (n) {
            tmp += (n % 10) * (n % 10);
            n /= 10;
        }
        n = tmp;
    }
    return true;
}

LeetCode1 两数之和

题目链接:两数之和(https://leetcode.cn/problems/two-sum/)
文档讲解:代码随想录(https://programmercarl.com)

做题情况

这道题使用 unordered_map ,原因有二:一是我需要查找数组当前遍历的值的差值是否出现过,因此需要使用哈希表;二是这里需要索引而不是我们找到的值,因此需要使用 nums[i] -> imap ;三是这里的 nums[i] 不需要排序,因此只用 unordered 。另外在实现的时候,要注意我们是用当前的差值去查过去的值 (而不是值的差值) 是否存在,要注意查的值是 diff 和插入的值是 nums[i] ;最后要注意数组的构造方式,一开始我写成了 std::vector(sum_index_map[diff], i) ,它的意思是指构造一个包含 sum_index_map[diff] 个值为 i 的vector,这显然错误了。

以下是代码:

vector<int> twoSum(vector<int>& nums, int target) {
    unordered_map<int, int> sum_index_map;
    for (int i = 0; i < nums.size(); i++) {
        int diff = target - nums[i];
        if (sum_index_map.find(diff) != sum_index_map.end()) {
            return {sum_index_map[diff], i};
        }
        else {
            sum_index_map[nums[i]] = i;
        }
    }
    return { };
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值