记录刷题中遇见的一些知识点方便复习

一、 LeetCode第一题(1)

两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

纯小白,只知道暴力求解

时间复杂度O(n²),空间复杂度O(1)

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> ans;
        int n = nums.size();
        for(int i = 0; i < n; i++){
            for(int j = i+1; j < n; j++){
                if(nums[i]+nums[j] == target){
                    ans.push_back(i);
                    ans.push_back(j);
                    return ans;
                }                   
            }
        }
        return ans;
    }
};
遇到的函数

1. nums.size()

2. 关于push_back函数

 在Vector最后添加一个元素(参数为要插入的值)

查到的其他相关函数:

pop_back() //移除最后一个元素

clear()  //清空所有元素

empty() //判断vector是否为空,如果返回true为空

erase() // 删除指定元素

看评论区还有双指针、哈希表的方法求解,不懂,学会了再补充。

二、 LeetCode第二题(49)

才说不会用哈希表,这就来了,被迫学习

字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

看评论区有位大佬讲的很清楚

分析:

每种字母异位词内所有单词都有相同的字符,可以将单词内内的字母进行排序,得到的就是相同的字符串,这样就可以这个字符串作为键值来储存,将原来的字符串作为实值来存放。最后,再将答案存储自定义的变量中返回。(作者:哦豁  链接:https://leetcode.cn/problems/group-anagrams/solutions/2235374/49-zi-mu-yi-wei-ci-fen-zu-by-change-s3-pmis/来源:力扣(LeetCode))

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>>ans;
        int n = 0;
        string str;  //用来单独提取每个字符串
        //哈希表
        unordered_map<string,int>hash;
        for(int i = 0; i< strs.size(); i++){
            str = strs[i];
            //将每个字符串进行排序,作为键值,排序前的字符串作为值
            sort(str.begin(),str.end()); 
            if(hash.find(str) == hash.end())
            {
                hash[str] = n++; // 设置下标
                ans.push_back({}); //初始化

            }
            ans[hash[str]].push_back(strs[i]);

        }
        return ans;
    }
};
遇到的函数:

1. sort(begin, end, cmp)

begin为指向待排序的数组的第一个元素的指针,end为指向待sort()的数组的最后一个元素的下一个位置的指针,cmp参数为排序准则,cmp参数可以不写

2. find查找函数

2.1 字符串自带查找,string.find('a'),返回的是下标

2.2 find(start,end,value)

     find(a.begin(),a.end(),value)

返回的是迭代器或指针(此时我并不知道什么是迭代器)

哈希表的讲解看这个博客很详细:一文看懂哈希表并学会使用C++ STL 中的哈希表_哈希表end函数-CSDN博客

补充一个迭代的函数用法:

for(auto iter:vec)不改变迭代对象的值,for(auto &iter:vec)可以改变迭代对象的值

详细解析见:C++中for auto的用法_c++ for auto-CSDN博客

用哈希表必备的两句话:

#include<unordered_map>
unordered_map<type, type>table_name;

我的理解是排序后用哈希表的键找出所有相同字母的字符串,记下下标值,用原字符串(即值)对应输出。

看到一个更难理解的代码:(作者:一塌糊涂 链接:https://leetcode.cn/problems/group-anagrams/solutions/2637602/c-49-zi-mu-yi-wei-ci-fen-zu-ha-xi-biao-b-klnc/ 来源:力扣(LeetCode))

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        //特征归类 ---> 哈希表
        unordered_map<string,vector<string>> mp;
        for(auto t : strs){
            string key = t;
            sort(key.begin(),key.end());
            mp[key].push_back(t);
        }
        vector<vector<string>> res;
        for(auto t : mp) {
            res.push_back(t.second);
        }
        return res;
    }
};

这里主要是用了for auto 的用法。

看懂了for auto之后,真的通俗易懂好用!


编程好难啊,即使慢慢看懂代码是什么意思,一到自己写就完全没有思路TuT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值