您的位置:首页 > 编程语言 > C语言/C++

[LeetCode#1][C]Two Sum

2016-04-28 19:28 288 查看
作者:faaronzheng 转载请注明出处!

题目如下:



思路:

最简单的方法当然是用两层循环遍历。i和j分别记录当前下标,如果这两个下标对应的数的和等于目标值,那么返回下标。

代码:

/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target)
{
int* res = (int*)malloc(sizeof(int)*2);
for (int i = 0; i < numsSize; i++)
{
for (int j = i+1; j < numsSize; j++)
{
if (nums[i] + nums[j] == target)
{
res[0] = i;
res[1] = j;
return res;
}
}
}
return res;
}


结果:



进阶:

最初想到的是用hash结构来解决问题,可以减少一重循环。但是c语言还要自己实现hash结构,所以用两个数组分别映射值和下标的关系来达到相似的效果。这种方法还是有很大缺陷的,比如两个数的和不能太大,像下面的代码就规定了两个数的和不能大于65535(可以根据需求自己定义)。不过可以看出结果相较之前有很大提升。

代码:

/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target)
{
int* res = (int*)malloc(sizeof(int)*2);
int pos[65536]={0};        //用来存放正数。pos的下标对应的是nums的数,值对应的是nums的下标。
int neg[65536]={0};        //用来存放负数。对应关系同上
for(int i=0;i<numsSize;i++)
{
if(target-nums[i]>=0&&pos[abs(target-nums[i])]!=0)
{
res[0]=abs(pos[abs(target-nums[i])])-1;
res[1]=abs(i);
}
if(target-nums[i]<0&&neg[abs(target-nums[i])]!=0)
{
res[0]=abs(neg[abs(target-nums[i])])-1;
res[1]=abs(i);

}
if(nums[i]>=0)
pos[abs(nums[i])]=i+1;
if(nums[i]<=0)
neg[abs(nums[i])]=i+1;

}
return res;
}


结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息