题目描述
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
白话题目:
输入一组数组,已知数组的大小和欲求两数的目标值,求满足目标值的两个数在数组中的索引,而且这个数组还是有序的。
算法:
(1)有序的一个数组,如果你求左边最小的数+右边最大的数,相加的结果和target比较,
赶巧相等了,oh yeah 成功了
(2)如果 【那个和】<=target,说明左边的数取小了,就向右调节,调节大一些
(3)如果【那个和】>target,说明右边的数取大了,就向左动,调节小一些
(4)左右都调节完了,也没相等,那就返回-1,-1不行了吧
详细解释关注 B站 【C语言全代码】学渣带你刷Leetcode 不走丢 https://www.bilibili.com/video/BV1C7411y7gB
C语言完全代码
#include <stdio.h>
#include <stdlib.h>
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize)
{
int* ret = (int*)malloc(sizeof(int) * 2);
*returnSize = 2;
// i 起始从0开始
int i = 0;
// j 起始从最后一个开始
int j = numbersSize-1;
//因为数组元素从0开始,所以总长度-1 = 数组最后一个元素的位置;
//开始循环
while(i<j)
{
//计算出(i,j)位置的总和
int sum = numbers[i] + numbers[j];
//如果相等,那么好了,结果就是这个 ,然后需要返回元素,所以都+1;
if(sum == target)
{
ret[0] = i+1;
ret[1] = j+1;
return ret;
}
//不满足条件的,当总和小于(i,j)位置,i++是向下走,否则是j--向左走
if(sum<=target)
{
i++;
}
else
{
j--;
}
}
ret[0] = -1, ret[1] = -1;
return ret;
}
int main()
{
int target;
int numbersSize=0;
int i;
int returnSize=2;
printf("请输入数组数量及目标值,例(4 9):");
scanf("%d %d",&numbersSize,&target);
int numbers[numbersSize];
for(i=0; i<numbersSize; i++)
{
scanf("%d",&numbers[i]);
}
int *p=twoSum(numbers, numbersSize, target, &returnSize);
//输出
if(returnSize==2)
{
printf("索引号为:\n");
for(i=0; i<returnSize; i++)
{
printf("%d ",*(p+i));
}
}
else
{
printf("没有满足的\n");
for(i=0; i<numbersSize; i++)
{
printf("%d ",numbers[i]);
}
}
return 0;
}