您的位置:首页 > 其它

Two sum

2015-06-02 20:18 155 查看
Given an array of integers, find two numbers such that they add up to a specific target number.

The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution.

Input: numbers={2, 7, 11, 15}, target=9

Output: index1=1, index2=2

第一题,也是作为我的第一道算法题目 ,编出的代码简直不看入目,各种复杂,不看也罢。刚看题目第一时间想到的就是枚举法了(现学现卖),二次for循环遍历所有结果,代码如下:

int* twoSum(int* nums, int numsSize, int target) {
int index1 , index2;
int i , j;
for( i = 0 ; i < numsSize - 1  ; i++ )
for( j = i+1 ; j < numsSize ; j ++)
{
if(nums[i]+nums[j] == target)  {             printf("index1 = %d , index2 =%d",index1+1 , index2 +1);
return(0);
}
continue;
}
return(1);
}


不过显示很残酷,算法时间复杂度不满足要求O(n×n),能力不足够智能借鉴了,看下下网上大致有2种方法选择

(1) 利用哈希表,我没有使用这方法。

(2)双向指针——我的选择。

下面就说下第2种方法的思路。

如果给定一个从小到大的顺序数组,分别用指针head和tail指向数组头和尾,即分别指向了最大值和最小值。如果head和tail所指向值的和大于target那么就将tail向前移动,如若小了则向后移动head,这就是基本思想了。如果没有满足条件的组合那么最后head == tail。

那么根据上面想法,程序第一步就很明白了——排序(当然复杂度要小)。我选用的是希尔排序。

整个程序各种纠结,不是很好大家不想看自己实现更好

代码如下:

int* twoSum(int* nums, int numsSize, int target) {
int i , j;
int *ptr[numsSize + 1];
/*  初始化 ptr */
for( i = 0 ; i <numsSize  ; i++)
ptr[i+1] =nums +i;
/*希尔排序*/
int increment = numsSize;
do{
increment = increment/3 +1;
for( i = increment +1 ; i <=numsSize ; i++)
{
if(*ptr[i] < *ptr[i -increment])
{   ptr[0] =ptr[i];
for( j=i-increment ; j > 0&&*ptr[0] < *ptr[j] ; j -=increment)
ptr[j+increment] =ptr[j];
ptr[j+increment] =ptr[0];
}
}
}while(increment >1);
/* 双向指针,找匹配值    */
int **head , **tail ;
int n  ;
head = &ptr[1] ;
tail =&ptr[numsSize] ;
while(tail != head){
n  = (**head) + (**tail);
if( n >target)
{   tail -=1;
continue;
}
if( n < target)
{
head +=1;
continue;
}
if( n==target){
int *index  =(int *)malloc(sizeof(int)*2);
int index1,index2;
index2 =(int *)*head -(int *)nums +1;
index1 =(int *)*tail- (int *)nums+1;
*index =index1>index2?index2 :index1;
*(index+1) =index1>index2?index1:index2;  return(index);                                }
}
int *index=(int *)malloc((size_t)sizeof(int));
*index = 0;
return(index);
}


实话,写完这题目,估计指针这方面问题会少很多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: