学渣带你刷Leetcode167. 两数之和 II - 输入有序数组

题目描述

给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。

函数应该返回这两个下标值 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值