LeetCode#167(简单)两数之和 II - 输入有序数组(3)

题目:给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。(注意这个条件)

  • 第一遍看题的时候我并没有注意到那个说明,//哭。然后看到题的一瞬间我就想起的第一天我做的那个题的 桶思想,然后我就顺着这个往下想,编写。然后我因为没有看到那个说明所以写的是又很多个答案的情况下。(同时还是因为官网上执行又错误,所以我展示的是用DEV C++ 上编写的代码,并且例子输出正确。)
#include<stdio.h>
#include<algorithm>

using namespace std;

int k = 0;
int* twoSum(int* numbers, int numbersSize, int target, int* r){
    int C[target + 1];//桶 存入符合条件的数 
    int M[100] = {0};//桶 存入符合条件的数字的位数 
    int i,j;
    for(i = 0;i < target + 1;i ++){
        C[i] = 0;//初始化 
    }
    for(i = 0;i < numbersSize;i ++){
        if(numbers[i] >= target) break;//当数比目标数要大的情况下,跳出,因为是升序数组 
        C[numbers[i]] = numbers[i];//存入数 
        M[numbers[i]] = i + 1;//存入位置 
    }
    for(i = 0,j = target;i < j;i ++,j --){
        if(C[i] + C[j] == target){//桶里的数对应位置前后相加为目标数的 
            r[k] = M[C[i]];
            k ++;
            r[k] = M[C[j]];
            k ++;
        }
    }
    return r;
}
int main(){
	int n,target;
	int numbers[100],r[100];
	scanf("%d",&n);
	for(int i = 0 ;i < n;i ++){
		scanf("%d",&numbers[i]);
	}
	scanf("%d",&target);
	twoSum(numbers,n,target,r); 
	sort(r,r + k);//排序 
	for(int i = 0;i < k;i ++){
		printf("%d ",r[i]);
	}
	return 0;
}

在这里插入图片描述

  • 然后因为官网执行错误,我又继续看题,根据提示,使用了双指针法。(并且注意到了那个说明,但是还是执行错误)
    在这里插入图片描述
    在这里插入图片描述
    我看一个网友的代码是这样的///(菜鸟大哭)表示试了好几次, *returnSize = 2; int *res = calloc(2,sizeof(int));感觉这两句换个位置执行就会发生一些错误。。。。。菜鸟表示不理解。(唉,好像涉及到返回一个数组的我的代码在官网上都执行错误了。。。。)。
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize){
    int low = 0,high = numbersSize - 1;

    while(low < high){
        int sum = numbers[low] + numbers[high];
        if(sum > target){
            high -= 1;
        }else if(sum < target){
            low += 1;
        }else{
            break;
        }
    }
    *returnSize = 2;
    int *res = calloc(2,sizeof(int));
    res[0] = low + 1;
    res[1] = high + 1;
    return res;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值