1. Description
Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice.
2. Example
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
3. Code
[restabs alignment="osc-tabs-right" responsive="true" icon="true" text="More" seltabcolor="#fdfdfd" seltabheadcolor="#000" tabheadcolor="blue"]
[restab title="C (S=O(N))" active="active"]
void QuickSort(int* aNums, int* aIndex, int aHead, int aTail)
{
if (aHead >= aTail)
{
return;
}
int mLeft = aHead, mRight = aTail, mNumTmp = aNums[mLeft], mIndexTmp = aIndex[mLeft];
while (mLeft < mRight)
{
while (mLeft < mRight && aNums[mRight] >= mNumTmp) mRight--;
if (mLeft < mRight)
{
aNums[mLeft] = aNums[mRight];
aIndex[mLeft] = aIndex[mRight];
mLeft++;
}
while (mLeft < mRight && aNums[mLeft] < mNumTmp) mLeft++;
if (mLeft < mRight) {
aNums[mRight] = aNums[mLeft];
aIndex[mRight] = aIndex[mLeft];
mRight--;
}
}
aNums[mLeft] = mNumTmp; aIndex[mLeft] = mIndexTmp;
QuickSort(aNums, aIndex, aHead, mLeft - 1);
QuickSort(aNums, aIndex, mLeft + 1, aTail);
}
int* twoSum(int* nums, int numsSize, int target)
{
if (numsSize < 2) {
return NULL;
}
int* mIndex = (int*)malloc(numsSize * sizeof(int));
for (int i = 0; i < numsSize; i++) {
mIndex[i] = i;
}
QuickSort(nums, mIndex, 0, numsSize - 1);
int mLeft = 0, mRight = numsSize - 1;
if (mLeft == mRight) {
return NULL;
}
int mNum = nums[mLeft] + nums[mRight];
while (mNum != target)
{
if (mNum > target && --mRight > mLeft) {}
else if (mNum < target && ++mLeft < mRight) {}
if (mLeft == mRight)
{
return NULL;
}
mNum = nums[mLeft] + nums[mRight];
}
if (mNum == target) {
int* mResult = malloc(2 * sizeof(int));
mResult[0] = mIndex[mLeft];
mResult[1] = mIndex[mRight];
return mResult;
}
return NULL;
}
[/restab]
[restab title="C (TEST)"]
#includevoid QuickSort(int* aNums, int* aIndex, int aHead, int aTail) { if (aHead >= aTail) { return; } int mLeft = aHead, mRight = aTail, mNumTmp = aNums[mLeft], mIndexTmp = aIndex[mLeft]; while (mLeft < mRight) { while (mLeft < mRight && aNums[mRight] >= mNumTmp) mRight--; if (mLeft < mRight) { aNums[mLeft] = aNums[mRight]; aIndex[mLeft] = aIndex[mRight]; mLeft++; } while (mLeft < mRight && aNums[mLeft] < mNumTmp) mLeft++; if (mLeft < mRight) { aNums[mRight] = aNums[mLeft]; aIndex[mRight] = aIndex[mLeft]; mRight--; } } aNums[mLeft] = mNumTmp; aIndex[mLeft] = mIndexTmp; QuickSort(aNums, aIndex, aHead, mLeft - 1); QuickSort(aNums, aIndex, mLeft + 1, aTail); } int* twoSum(int* nums, int numsSize, int target) { if (numsSize < 2) { return NULL; } int* mIndex = (int*)malloc(numsSize * sizeof(int)); for (int i = 0; i < numsSize; i++) { mIndex[i] = i; } QuickSort(nums, mIndex, 0, numsSize - 1); int mLeft = 0, mRight = numsSize - 1; if (mLeft == mRight) { return NULL; } int mNum = nums[mLeft] + nums[mRight]; while (mNum != target) { if (mNum > target && --mRight > mLeft) {} else if (mNum < target && ++mLeft < mRight) {} if (mLeft == mRight) { return NULL; } mNum = nums[mLeft] + nums[mRight]; } if (mNum == target) { int* mResult = malloc(2 * sizeof(int)); mResult[0] = mIndex[mLeft]; mResult[1] = mIndex[mRight]; return mResult; } return NULL; } int main() { int mNums[4] = { -3,4,3,90 }; int* mResult = twoSum(mNums, 4, 0); printf("[%d,%d]", mResult[0], mResult[1]); system("pause"); return 1; }
[/restab]
[/restabs]



Comments | NOTHING