C语言学习—力扣刷题之【数组】—两个数之和
首先说下开始在力扣做题的感受:看了那么久的C语言,也没有真正的练习过,真到了自己看题目写的时候,才发现自己以为的懂了,其实啥也不是,甚至连题目已经给出的函数框架也要理解很久。所以还是要多多自己分析并动手敲代码才能真正有所提高。
题目:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
实例:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] )
分析:
1、定义两个指针p1,p2,第一个p1首先指向数组第一个元素并固定,然后第二个指针p2从第二个指针指向第一个指针指向的后一个元素;
2、p1固定,p2向后遍历,遍历过程中并计算当前指向元素与p1指向元素相加之和,并与target进行比较;
3、若第一次遍历,未能找到两个元素之和等于target,则p1向后移动一个元素,p2继续第2步,进行遍历;
4、重复2、3两步,直至找到两个元素之和等于target;
代码编写
//两数相加函数
int* TwoSum(int* nums,int numsSize, int target,int* returnSize)
{
int i = 0;
int j = 0;
*returnSize = 2; //这里必须有,力扣代码主函数有用到(怀疑,不加的话会不通过)
int* result = (int*)malloc(sizeof(int)*2); //申请空间进行数据下标存储
for(i = 0; i < numsSize-1; i++)
{
for(j = i+1; j< numsSize ;j++)
{
if(nums[i]+nums[j] == target)
{
result[0] = i;
result[1] = j;
return result;
}
else
{
*result = -1;
}
}
}
return result;
}
//主函数,该主函数为自己运行测试用
int main()
{
int i = 0;
int NumsLen = 0;
int target = 0;
int* returnnum = (int*)malloc(sizeof(int)*1);//这里需要进行空间申请,因为TwoSum函数中使用该地址空间
int* res = NULL;
printf("请输入数组长度>:\n");
scanf("%d",&NumsLen);
int *nums = (int*)malloc(sizeof(int)*NumsLen);
printf("请输入数据>:\n");
for(i = 0; i < NumsLen; i++)
{
scanf("%d",&nums[i]);
}
printf("请输入目标值>:\n");
scanf("%d",&target);
for(int j = 0; j < NumsLen; j++)
{
printf("%d ",nums[j]);
}
printf("\n");
printf("打印结果>:\n");
res = TwoSum(nums,NumsLen,target,returnnum);
if(*res!=(-1))
{
printf("[%d %d]",res[0],res[1]);
}
else
{
printf("Not Find!\n");
}
//释放空间
free(res);
free(nums);
free(returnnum);
res = NULL;
nums = NULL;
returnnum = NULL;
return 0;
}
结果:
该方法是最基本的最简单的方法,内存消耗较大,时间较长,时间复杂度为O(n^2)。
所以该题目下方有句话:
那就涉及到__哈希表了__。。。
图片转存中…(img-dL0yQLAp-1676548761536)]
所以该题目下方有句话:
[外链图片转存中…(img-6h5EnFwH-1676548761537)]
那就涉及到__哈希表了__。。。
学到了再继续。。