代码随想录算法训练营day05

Leetcode242.有效的字母异位词

1.思路

由于字母总共26个,所以有限空间,要标记出现的次数,直接用vector来标记,a-z可以用相对下标来表示(x的下标为x-'a')

2.代码

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

3.复杂度分析

时间复杂度:O(n)

空间复杂度:O(1)

4.Reference:代码随想录

Leetcode349.两个数组的交集

1.思路

由于题目没有限定数值的大小,无法使用数组来进行哈希实现。所以考虑用集合:std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。

重点:

1.注意返回类型为vector<int>,所以还要进行转变类型

2.注意set的插入操作是insert,删除操作为erase

2.代码

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result;
        unordered_set<int> set1(nums1.begin(),nums1.end());//将nums1中的元素初始化到set1中
        for(auto num:nums2){//遍历nums2
            if(set1.find(num)!=set1.end()){//如果nums2中的元素出现在nums1中
                result.insert(num);//将其插入result中
            }
        }
        vector<int> result1(result.begin(),result.end());
        return result1;
    }
};

3.复杂度分析

时间复杂度:O(m+n)

空间复杂度:O(1)

4.Reference:代码随想录

Leetcode202.快乐数

1.思路

题目中说了会 无限循环,那么也就是说求和的过程中,happy会重复出现,这对解题很重要!

用unordered_set来标记sum。

2.代码

class Solution {
public:
    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> result;
        int happy=n;
        while(1){
            if(happy==1) //若出现快乐数
            return true;
            if(result.find(happy)!=result.end()) //若happy重复出现
            return false;
            result.insert(happy);
            happy=getsum(happy);//修改happy
        }
    }
};

3.复杂度分析

时间复杂度:O(log n)

空间复杂度:O(log n)

4. Reference:代码随想录

Leetcode1.两数之和

1.思路

使用数组和set来做哈希法的局限。

  • 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。
  • set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下标位置,因为要返回x 和 y的下标。所以set 也不能用。

此时就要选择另一种数据结构:map ,map是一种key value的存储结构,可以用key保存数值,用value再保存数值所在的下标。

注意:

1.第一个for不能用for(auto it:nums),因为要返回下标,所以只能用i。

2.注意使用迭代器访问map

2.代码

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int,int> map1;
        for(int i=0;i<nums.size();i++){
            auto iter=map1.find(target-nums[i]);//iter为map1的迭代器
            if(iter!=map1.end()){
                return {iter->second,i};
            }
            map1.insert(pair<int,int>(nums[i],i));
        }
        return {};
    }
};

3.复杂度分析

时间复杂度:  O(n)

空间复杂度:O(n)

4.Reference:代码随想录

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码随想录算法训练是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值