题目:给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。
算法分析:
算法实现:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
int* result=(int *)malloc(sizeof(int)*2);//动态分配内存空间2个
for(int i=0;i<numsSize;i++)
for(int j=i+1;j<numsSize;j++)
{
if(nums[i]+nums[j]==target)
{
result[0]=i;
result[1]=j;
*returnSize=2; //指定返回数组长度
return result;//返回结果数组
break;//满足条件就退出循环
}
}
free(result); //释放内存
return 0;
}
测试结果:
新内容记录:关于malloc
函数的用法
具体用法:
/*
如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL,
因此应该多加一个判断语句处理意外。
*/
int *p;
p=(int *)malloc(sizeof(int));//指针类型 强制转换 指定空间大小
free(p)//释放内存
注意事项:
- malloc的返回类型是
void*
,c,c++
规定该类型可以通过类强制转换称任何其他类型的指针。 - 使用前需要声明
#include <stdlib.h>
或者#inlcude<malloc.h>
- 最后需要通过
free()
手动释放内存空间。
2023.7.9改进(双指针版)
已知数组是一个有序的,设置双指针,指向头部和尾部,如果头部加尾部>target,那么尾指针向前移动,反之,头指针向后移动,总能找到一个目标数等于target,用res数组值存入两个数的下标。
已知题目给的是下标从1开始的,所以在返回res数组下标时需要+1
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
#include <stdlib.h>
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize)
{
int *res=(int *)malloc(sizeof(int)*2);
int low=0;//必须从0开始
int high=numbersSize-1;//头尾指针
while(low<high)
if(numbers[low]+numbers[high]==target)
{
res[0]=low+1;
res[1]=high+1;
*returnSize=2;//
return res;
}
else if(numbers[low]+numbers[high]>target)
high--;
else
low++;
free(res);
return NULL;
}
Q:关于数组下标题目给出的从1开始,当如果从1开始访问又会报错?