首页 > 其他 > 详细

leetcode第一题-two Sum

时间:2015-03-24 17:32:27      阅读:196      评论:0      收藏:0      [点我收藏+]

很快我的研一上半学期就愉快的结束了,感觉每天都在忙,但是就看不到成果。转眼间就到了下学期,实习与论文的压力接踵而至,原来也接触过一部分的OJ,但是总体做的不是很深,所以利用这个机会,好好的把leetcode的题目做一做,检测一下自己的算法能力以及重新拾起丢掉的编程感觉。

第一题是一个查找类型的题目,当我看到题目的时候,不就是找到两个下标嘛,直接双重循环,上代码:

#include<stdio.h>
#include<stdlib.h>


int *twoSum(int numbers[],int n,int target)
{
	int *index=(int*)malloc(sizeof(int)*2);
	int i,j;
	for(i=0;i<n;i++)
	{
		for(j=i;j<n;j++)
		{
			if(numbers[i]+numbers[j]==target)
			{
				index[0]=i+1;
				index[1]=j+1;
				break;
			}
			else
				continue;
		}
	}
	return index;
}

int main()
{
	int a[100],n;
	while(scanf("%d",&n)!=EOF)
	{
		for(int i=0;i<n;i++)
			scanf("%d",&a[i]);
		int target;
		scanf("%d",&target);
		int *index=twoSum(a,n,target);
		printf("index1=%d,index2=%d\n",index[0],index[1]);
	}
	return 0;
}
直接就超时了,花擦,看来还有点意思,没有我想象中的那么容易!痛定思痛,只能找一个时间复杂度更低的了。仔细的读题目发现,并没有说明输入的数组的是有序的,我们就可以在这个地方下功夫,加入输入的是无序的数组,我就自然的想到了先用快速排序,然后再用其他的查找方式,在这里我用的是二分查找,具体的实现如下:
#include<stdio.h>
#include<stdlib.h>

void swap(int *x,int *y)//交换两个数
{
	int tmp=*x;
	*x=*y;
	*y=tmp;
}

int binarySearch(int numbers[],int target,int low,int high)//二分查找
{
	if(low>high)
		return -1;
	int mid=(high-low)/2+low;
	if(target>numbers[mid])
		return binarySearch(numbers,target,mid+1,high);
	else if(target<numbers[mid])
		return binarySearch(numbers,target,low,mid-1);
	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=binarySearch(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;
}

int main()
{
	int a[100],n;
	while(scanf("%d",&n)!=EOF)
	{
		for(int i=0;i<n;i++)
			scanf("%d",&a[i]);
		int target;
		scanf("%d",&target);
		int *index=twoSum(a,n,target);
		printf("index1=%d,index2=%d\n",index[0],index[1]);
	}
	return 0;
}

用了这两种实现,运行的时间只有5ms,也顺利的AC了。



leetcode第一题-two Sum

原文:http://blog.csdn.net/zyh920521/article/details/44591643

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!