LeetCode简单题-两数之和的解法
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
方法1-两层for循环
C++解法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i,j;//定义两个数的下标
int len = nums.size();//nums.size()获取向量元素个数
for(i = 0; i < len - 1; i++)
{
for(j = i+1; j < len; j++)
{
if(nums[i]+nums[j] == target)
return {i,j};
}
}
}
};
C解法
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int i,j;//两数的下标
int *result = NULL;
*returnSize = 0;
for(i = 0; i < numsSize-1; i++)
{
for(j = i+1; j < numSize; j++)
{
if(nums[i] + nums[j] == target)
{
result = malloc(sizeof(int)*2);
if(result != NULL)
{
result[0] = i;
result[1] = j;
*returnSize = 2;
return result;
}
}
}
}
return result;
}
暴力解法使用了两层循环,时间复杂度是O(n^2),空间复杂度为O(1);
2.哈希解法
暴力哈希解法1–用到了两层for循环
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> hash;//建立hash表存放数组元素,key:数组元素的数值,value:数组元素下标
vector<int> result(2,-1);//创建一个数组,长度为2,初始值-1
//将数组元素和下标以对组的形式存入hash表
for(int i = 0; i < nums.size(); i++)
hash.insert(make_pair(nums[i],i));
//一个数为nums[i],另外一个数为target-nums[i]
for(int j = 0; j < nums.size(); j++)
{
//在hash表中查找key=target-nums[i]
if(hash.count(target-nums[i]) > 0 && hash[target-nums[i]] != i)
{
result[0] = i;
result[1] = hash[target-nums[i]];
break;
}
}
return result;
}
};
改进哈希解法1–用到了一层for循环
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> hash;//建立hash表存放数组元素,key:数组元素的数值,value:数组元素下标
vector<int> result(2,-1);//创建一个数组,长度为2,初始值-1
for(int i = 0; i < nums.size(); i++)
{
hash.insert(make_pair(nums[i],i));
//在hash表中查找key=target-nums[i]
if(hash.count(target-nums[i]) > 0 && hash[target-nums[i]] != i)
{
result[0] = i;
result[1] = hash[target-nums[i]];
break;
}
}
return result;
}
};