一、 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