Two Sum的快排暴力解法

没有用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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值