前段日子学完c++基础知识,今天开始系统刷leetcode了,每天复盘一下自己的刷题进度及思考过程。加油!
2023.5.17
1、本人解法(暴力解ToT)
class Solution
{
public:
vector<int> twoSum(vector<int>& nums, int target)
{
vector<int> ans;
for(int i=0;i<nums.size();i++)
{
for(int j=i+1;j<nums.size();j++)
{
if(nums[i]+nums[j]==target)
{
ans.push_back(i);
ans.push_back(j);
return ans;
}
}
}
return {};
}
};
看到题目瞬间能想到的就是暴力解了,甚至暴力解过程中也出现了很多问题。 数组长度一开始我是用int len=sizeof(nums)/sizeof(nums[0]) 这种方法求出来的,但是一直报错,后面发现可以直接用nums.size()。
然后就是要看清楚返回值,题目要求返回值的类型是vector<int> ,我一开始直接返回的 i和j,正确做法应该是建个vector,然后将i 和 j放进去,返回这个vector。 也可以直接返回{i,j} 。
最后的return{ } 也是必要的,不论找到元素与否总要有返回值的。
看了下讨论区还看到一些别的解法,等有机会再重新做一下。
2、解法二:使用map(非哈希表)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ans;
map<int,int> mp;
for(int i=0;i<nums.size();i++)
{
mp[nums[i]]=i;
}
for(int j=0;j<nums.size();j++)
{
if(mp.count(target-nums[j])==1 && mp[target-nums[j]]!=j)
{
ans.push_back(j);
ans.push_back(mp[target-nums[j]]);
return ans;
}
}
return {};
}
};
先复习一下之前学习的map容器的一些特点:
- map容器中的所有元素都是pair对,第一个元素为键值,第二个元素为实值。
- map容器中的键值会自动排序。
- map容器中的键值既不能重复也不能修改。
这是学习别的博客的解法,利用map容器的键值唯一的特点,使用一个for循环将数组nums中的元素放入map容器的键值中,这样数组里相同的元素在map里不会重复,而map的实值存放索引值,(注意到map中重复的元素的索引值会被覆盖)。第二个for循环查找满足条件的索引,第一个条件是target-nums[j] 这个值在map中存在,第二个条件是 若存在,那么索引值不能是j,(如果是j那就不满足条件”数组中同一个元素在答案里不能重复出现“的要求了。满足条件的索引值push到vector中,最后返回vector。
2023.6.9
最近学到哈希,今天来更新一下这道题的哈希解法。 直接上代码:
3、解法三:哈希法(unordered_map)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target)
{
unordered_map<int,int> map; //以unordered_map为哈希结构
for(int i=0; i<nums.size(); i++)
{
auto iter = map.find(target - nums[i]);
if(iter != map.end())
{
return {iter->second , i};
}
map.insert(pair<int,int>(nums[i],i));
}
return {};
}
};
也复习了一下map相关的一些操作。
这道题不需要有序,也不需要重复,所以选择速度最快的 unordered_map。
2023.9.14
今天开始刷leetcode Hot 100题,加油。
时隔三个月,三刷了。这题主要解法就是暴力解和哈希法。 下面再敲一次哈希解法:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int>hash;
for(int i=0; i<nums.size(); i++)
{
if(hash.find(target-nums[i]) != hash.end())
{
return {i , hash[target-nums[i]]};
}
hash[nums[i]] = i;
}
return {};
}
};