算法题打卡day6 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

242. 有效的字母异位词 - 力扣(LeetCode)

状态:字母表哈希数组AC。

暴力法没什么好说的,哈希数组思路进行三次遍历即可,空间换时间,也没什么好说的,时间复杂度O(n),空间复杂度O(n)

349. 两个数组的交集 - 力扣(LeetCode) 

状态:初见考虑使用的是unordred_map,没有仔细读题,后续查看题解后使用unordered_set,但在最终返回时处理有误。

set的一个好处是可以去重复,但是如果题目中的数值没有特别大,还是用哈希数组来解决更为高效,因为set中的hash计算也有时间。这道题中对set和vector赋值的操作以及哈希数组和set的优缺点分析值得仔细回味。时间复杂度O(mn),空间复杂度O(n)。set代码如下:

vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
    unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重
    unordered_set<int> nums_set(nums1.begin(), nums1.end());
    for (int num : nums2) {
        // 发现nums2的元素 在nums_set里又出现过
        if (nums_set.find(num) != nums_set.end()) {
            result_set.insert(num);
        }
    }
    return vector<int>(result_set.begin(), result_set.end());
}

哈希数组的代码:

vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
    unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重
    int hash[1005] = {0}; // 默认数值为0
    for (int num : nums1) { // nums1中出现的字母在hash数组中做记录
        hash[num] = 1;
    }
    for (int num : nums2) { // nums2中出现话,result记录
        if (hash[num] == 1) {
            result_set.insert(num);
        }
    }
    return vector<int>(result_set.begin(), result_set.end());
}

202. 快乐数 - 力扣(LeetCode) 

状态:初见没有思路,对各位数的获取存在畏难情绪。

这道题总体思路上最关键的就是发现什么情况下可以判断一个数「不是」快乐数。典型的难者不会会者不难。当我们在不断计算平方和的过程中,一旦平方和已经出现过一次,就意味着之后会陷入无限循环,可以判断「不是」快乐数。时间复杂度O(logn),空间复杂度O(logn),(这里对复杂度的分析要好好推演)。代码如下:

//获取各位上的单数之和
int getSum(int n){
    int sum = 0;
    while(n){
        sum += (n % 10) * (n % 10);
        n /= 10;
    }
    return sum;
}
bool isHappy(int n) {
    unordered_set<int> record;
    while(1){
        int sum = getSum(n);
        if(sum == 1){
            return true;
        }
        if(record.find(sum) != record.end()){
            //已经出现过,之后会无限循环
            return false;
        }else{
            record.insert(sum);
        }
        n = sum;
    }
}

1. 两数之和 - 力扣(LeetCode)

状态:想到了利用unordered_map来解决,但是返回成vector时的格式出现了错误。

 思路没什么好说的,和哈希数组一样,但是考虑到值很大,采用map来实现。需要注意的是返回为vector时格式为{x, y},在给map插入新元素时直接map[i] = j即可。

哈希表中的一些注意:hash_set/map和unordered_set/map的区别:一个是官方认证一个是民间实现,在技术上没有区别。multi_set/map的底层实现是红黑树,因此查询/增删效率为O(logn),unordered_set/map的底层实现是哈希表/桶(开链法解决碰撞),查询/增删效率为O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值