twoSum,利用双指针返回下标

来源:互联网 发布:Mac字幕太小 编辑:程序博客网 时间:2024/05/18 07:39

给一个int型数组无序,从数组中选出两数字,使得这两数字之和为target,将这两数字的下标作为数组返回。

利用双指针查找数组元素,并返回元素下标。


#include<stdio.h>

#include<malloc.h>//在堆中分配内存
#include<stdlib.h>//排序所需头文件




用来做比较的函数。
int comp(const void*a,const void*b)
{
    return *(int*)a-*(int*)b;
}

指针函数,需要参数为数组首地址,数组大小,目标值。
int* twoSum(int* nums,int numsSize,int target)
{
int *pr=nums;
int low=0;
int high=numsSize-1;//创建双指针,一个指向数组首地址,另一个指向数组最后一个元素
int i;
int *copy=(int*)malloc(sizeof(int)*numsSize);
for(i=0;i<numsSize;i++)//最后返回的是原数组的下标,先对数组进行复制
copy[i]=nums[i];
qsort(nums,numsSize,sizeof(int),comp);//调用qsort排序
int *a=(int*)malloc(sizeof(int)*2);//这里不能直接int a[2],int a[2]的空间将分配在栈中,函数结束后,空间被释放,返回值不会被继承。利用malloc函数在堆中分配内存
while(*(pr+low)+*(pr+high)!=target)
{
if(*(pr+low)+*(pr+high)<target)
low++;
if(*(pr+low)+*(pr+high)>target)
high--;
}//如果和小于target,low++,和增大,反之high--,和减小,因为一定会有target出现,不用判断不存在的情况。
for(i=0;i<numsSize;i++)
{
if(copy[i]==*(pr+low))
a[0]=i;
if(copy[i]==*(pr+high))
a[1]=i;
}查找原数组的下标
return a;
}



在主函数中创建数组并作为参数调用twoSum函数。
int main()
{
int nums[100];
int target;
int numsSize;
scanf("%d %d",&target,&numsSize);
int i;
for(i=0;i<numsSize;i++)
{
scanf("%d",&nums[i]);
}
int *p=twoSum(nums,numsSize,target);//接受返回值
printf("%d %d",*p,*(p+1));
return 0;
}
1 1
原创粉丝点击