力扣1-两数之和

打印 上一主题 下一主题

主题 1029|帖子 1029|积分 3087

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一.题目
给定一个整数数组 nums 和一个整数目的值 target,请你在该数组中找出 和为目的值 target  的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意次序返回答案。
示例 1:
  1. <strong>输入:</strong>nums = [2,7,11,15], target = 9
  2. <strong>输出:</strong>[0,1]
  3. <strong>解释:</strong>因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
复制代码
示例 2:
  1. <strong>输入:</strong>nums = [3,2,4], target = 6
  2. <strong>输出:</strong>[1,2]
复制代码
示例 3:
  1. <strong>输入:</strong>nums = [3,3], target = 6
  2. <strong>输出:</strong>[0,1]
复制代码
二.代码
  1. int* twoSum(int* nums, int numsSize, int target,int* returnSize)
  2. {
  3.     static int a[2]={0};
  4.     for(int i=0;i<numsSize-1;i++)
  5.     {
  6.         for(int j=i+1;j<numsSize;j++)
  7.         {
  8.             if(nums[i]+nums[j]==target)
  9.             {
  10.                 a[0]=i;
  11.                 a[1]=j;
  12.                 * returnSize=2;
  13.                 return a;
  14.             }
  15.         }
  16.     }
  17.     return NULL;
  18. }
复制代码
三.代码解读
1.函数参数


  • int* nums:指向整数数组的指针,这个数组包罗了要进行查找操纵的元素。
  • int numsSize:表示数组 nums 的元素个数,用于控制循环的边界,确保不会越界访问数组元素。
  • int target:需要寻找的两个数之和的目的值。
  • int* returnSize:一个指针,用于将找到的满足条件的元素个数,返回给调用者。
2.static作用
使用static可以包管在函数返回后,所指向的数组内容依然有效(因为其生命周期贯穿整个程序运行阶段),使得调用者可以大概正确获取到在函数内部盘算并存储好的满足条件的两个下标的值(存储在a数组中)。假如不消static,在函数返回后,本来的局部数组所在内存被开释接纳,那么返回的指针就变成了悬空指针,指向的是无效的内存区域,后续再去访问就会出现错误(比如出现未界说行为,大概导致程序瓦解等)。
3.循环逻辑


  • 外层循环:通过for (int i = 0; i < numsSize - 1; i++)控制,从数组的第一个元素开始,依次遍历到倒数第二个元素(因为内层循环会从i + 1开始处理背面的元素,这样可以避免重复的元素组合情况)
  • 内层循环:for (int j = i + 1; j < numsSize; j++),在内层循环中,对于外层循环当前遍历到的元素nums,从它背面的元素(即nums[i + 1]开始)依次往后遍历整个数组,直到数组末尾。
四.补全代码
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. // twoSum函数定义,功能是在给定数组中找两数之和等于目标值的两个元素下标
  4. int* twoSum(int* nums, int numsSize, int target, int* returnSize)
  5. {
  6.     static int a[2] = {0};
  7.     for (int i = 0; i < numsSize - 1; i++)
  8.     {
  9.         for (int j = i + 1; j < numsSize; j++)
  10.         {
  11.             if (nums[i] + nums[j] == target)
  12.             {
  13.                 a[0] = i;
  14.                 a[1] = j;
  15.                 *returnSize = 2;
  16.                 return a;
  17.             }
  18.         }
  19.     }
  20.     return NULL;
  21. }
  22. int main()
  23. {
  24.     int numsSize;
  25.     printf("请输入数组元素个数:");
  26.     scanf("%d", &numsSize);
  27.     int* nums = (int*)malloc(numsSize * sizeof(int));
  28.     if (nums == NULL)
  29.     {
  30.         perror("内存分配失败");
  31.         return -1;
  32.     }
  33.     printf("请依次输入数组元素:");
  34.     for (int i = 0; i < numsSize; i++)
  35.     {
  36.         scanf("%d", &nums[i]);
  37.     }
  38.     int target;
  39.     printf("请输入目标值:");
  40.     scanf("%d", &target);
  41.     int returnSize;
  42.     int* result = twoSum(nums, numsSize, target, &returnSize);
  43.     if (result!= NULL)
  44.     {
  45.         printf("找到满足条件的两个下标为:%d 和 %d\n", result[0], result[1]);
  46.     }
  47.     else
  48.     {
  49.         printf("未找到满足条件的两个数之和。\n");
  50.     }
  51.     free(nums);
  52.     return 0;
  53. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊雷无声

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表