没有用hash table,用了快排和二分搜索,总的来说还是Brute Force
基本没有参考意义,算是对快排和二分的练手
void swap(int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
return;
}
int search(int numbers[], int target, int low, int high)
{
if (low > high)
return -1;
int mid = low + (high - low) / 2;
if (target < numbers[mid])
return search(numbers, target, low, mid - 1);
else if (target > numbers[mid])
return search(numbers, target, mid + 1, high);
else
return mid;
}
void sort(int numbers[], int orders[], int low, int high)
{
int key, keyOrder, i, j, ran;
if (low < high)
{
ran = (low + high) / 2;
swap(&numbers[ran], &numbers[low]);
swap(&orders[ran], &orders[low]);
key = numbers[low];
keyOrder = orders[low];
i = low + 1;
j = high;
while (i <= j)
{
while ((i <= high) && (numbers[i] <= key))
i++;
while ((j >= low) && (numbers[j] > key))
j--;
if (i < j)
{
swap(&numbers[i], &numbers[j]);
swap(&orders[i], &orders[j]);
}
}
swap(&numbers[low], &numbers[j]);
swap(&orders[low], &orders[j]);
sort(numbers, orders, low, j - 1);
sort(numbers, orders, j + 1, high);
}
}
int *twoSum(int numbers[], int n, int target) {
int i = 0, j = -1;
int *index = (int *)malloc(2 * sizeof(int));
int len = n;
int *orders = (int *)malloc(n * sizeof(int));
for (i = 0; i < len; i++)
{
orders[i] = i + 1;
}
sort(numbers, orders, 0, len - 1);
for (i = 0; i < len; i++)
{
j = search(numbers, target - numbers[i], i + 1, len - 1);
if (j > -1)
break;
}
if (j > -1)
{
if (orders[i] > orders[j])
{
index[0] = orders[j]; index[1] = orders[i];
}
else
{
index[0] = orders[i]; index[1] = orders[j];
}
return index;
}
else
return NULL;
}