很快我的研一上半学期就愉快的结束了,感觉每天都在忙,但是就看不到成果。转眼间就到了下学期,实习与论文的压力接踵而至,原来也接触过一部分的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了。
原文:http://blog.csdn.net/zyh920521/article/details/44591643