twoSum,利用双指针返回下标

给一个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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值