给定一个整数数组和一个目标值,找出数组中和目标值的两个数。
你可以假设每个输入只对应一种答案,且同样地元素不能被重复使用。
示例:
给定nums = [2, 7, 11, 15]; target = 9;
因为nums[0] + nums[1] = 2 + 7 = 9;
所以返回[0 ,1]
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define null 0
struct object
{
int iValue;
int iIndex;
};
int compare(const void *a, const void *b)
{
return ((struct object*)a)->iValue - ((struct object*)b)->iValue;
}
static int *TwoSum(int *pInt, int iSize, int iTarget)
{
int i;
int j;
int diff;
int *result = null;
struct object *pstObject = null;
pstObject = (struct object *)malloc(iSize * sizeof(*pstObject));
if (null == pstObject)
{
printf("\r\np1 malloc failed.");
return null;
}
memset(pstObject, 0, iSize * sizeof(*pstObject));
for (i = 0; i < iSize; i++)
{
pstObject[i].iValue = pInt[i];
pstObject[i].iIndex = i;
}
qsort(pstObject, iSize, sizeof(*pstObject), compare);
result = (int *)malloc(2 * sizeof(*result));
if (null == result)
{
printf("\r\np2 malloc failed");
return null;
}
memset(result, 0, 2 * sizeof(*result));
i = 0;
j = iSize - 1;
while(i < j)
{
diff = iTarget - pstObject[i].iValue;
if (diff > pstObject[j].iValue)
{
while ((++i<j) && (pstObject[i].iValue == pstObject[i - 1].iValue))
{
}
}
else if (diff < pstObject[j].iValue)
{
while ((i < --j) && (pstObject[j].iValue == pstObject[j + 1].iValue))
{
}
}
else
{
result[0] = pstObject[i].iIndex;
result[1] = pstObject[j].iIndex;
j = 0;
}
}
free(pstObject);
pstObject = null;
return result;
}
int main()
{
int aiArray[] = {3, 6, 9, 5, 2};
//int iTarget = 5;
int iTarget = 10;
int iSize;
int *result;
iSize = sizeof(aiArray) / sizeof(*aiArray);
result = TwoSum(aiArray, iSize, iTarget);
if (null == result)
{
printf("\r\ntwo sum malloc failed");
}
else
{
printf("\r\nresult = [%d, %d]", result[0], result[1]);
}
free(result);
result = null;
return 0;
}