时光荏苒,博主也是再次来到leetcode的起点了,今天的我早已不是过去的我,回归正题接下来开始我们的算法之旅吧
cpp
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
int* arr =(int*)malloc(sizeof(int)*2);
* returnSize=0;
for(int i = 0;i<numsSize-1;i++)
{
for(int j = i+1;j<numsSize;j++)
{
if(nums[i]+nums[j]==target)
{
arr[0]=i;
arr[1]=j;
* returnSize=2;
return arr;
}
}
}
return arr;
}
ps.这是博主在今年1月17日,提交的代码,那时博主还很小白
一、题目解析

1、同一个元素不能使用两次
2、返回答案的顺序任意
二、算法原理
解法1:暴力解法(向后枚举)

解法2:暴力解法(由前向后枚举)

解法3:在解法2的基础上使用哈希表优化
1、为什么要用哈希表优化?
我们需要频繁的查找某一个元素,用哈希表可以达到O(1)的查找
2、该如何使用哈希表?
根据题目的需求,我们的哈希表中要存储<nums[i],i>,这里的i是对应的下标;在遍历元素时,先固定一个值nums[i],然后在哈希表中找target-nums[i],如果存在,则返回{hash[target-nums[i],i},如果不存在,则把nums[i]和i插入到哈希表中

为什么不在解法1的基础上用哈希表优化?
1、在一般情况下是可以的,我们把所有元素放到哈希表中,然后查找
2、但如果存在nums[i] = 4,target = 8时,在哈希表中查找,会违反题目条件,即相同元素使用两次,需要进行条件的特判,所以不在解法1的基础上优化
三、代码示例
解法1:暴力解法(向后枚举)
cpp
//解法1:暴力枚举(向后枚举)
vector<int> twoSum(vector<int>& nums, int target)
{
for(int i = 0;i<nums.size();i++)
{
for(int j = i+1;j<nums.size();j++)
if(nums[i]+nums[j] == target)
return {i,j};
}
return {0,0};
}

这里的{i,j}构造一个vector的匿名对象
解法2:暴力解法(由前向后枚举)
cpp
//解法2:暴力解法(由前向后枚举)
vector<int> twoSum(vector<int>& nums, int target)
{
for(int i = 0;i<nums.size();i++)
{
for(int j = 0;j<i;j++)
if(i != j && nums[i]+nums[j] == target)
return {i,j};
}
return {0,0};
}

解法3:在解法2的基础上使用哈希表优化
cpp
//解法3:哈希表优化
vector<int> twoSum(vector<int>& nums, int target)
{
unordered_map<int,int>hash;
for(int i = 0;i<nums.size();i++)
{
if(hash.count(target-nums[i]))
return {hash[target-nums[i]],i};
hash[nums[i]] = i;
}
return {0,0};
}
