力扣:探索初级算法——数组篇——两数之和。

题目:两数之和在这里插入图片描述

代码(C语言)

官方题解

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
#define MAX_SIZE 2048
int *twoSum(int *nums, int numsSize, int target, int *returnSize){   //returnSize表示返回数组长度
   
    int i,hash[MAX_SIZE],*res=(int *)malloc(sizeof(int)*2);
                                              //这里是指分配了2个连续的存储空间,即数组的长度                                                          //即后面的res【0】与res【1】,也可以分配更大的。 
    memset(hash, -1, sizeof(hash));         //memset是初始化函数,这里是初始化hash[2000],初始值设为 -1 
    for(i = 0;i < numsSize; i++)
    {
        if(hash[(target-nums[i] + MAX_SIZE) % MAX_SIZE] != -1)        //因为有负数,为了防止数组越界
                                                                      //用了求余法,把负数放在后面了
                                                                      //这里求得是hash的下标
        {
            res[0] = hash[(target - nums[i] + MAX_SIZE) % MAX_SIZE];  
            res[1] = i;            //i是nums的下标,是hash的元素
            *returnSize = 2;       //存在两个数相加得target,所以返回长度为2
            return res;
        }
        hash[(nums[i] + MAX_SIZE) % MAX_SIZE] = i;  //防止负数下标越界,循环散列
    }
    free(hash);
    *returnSize = 0;      //如果没找到合要求的两个数,则返回长度为0
    return res;            
}

//参考链接:https://leetcode-cn.com/problems/two-sum/solution/cyu-yan-ji-yu-shu-zu-de-san-lie-15xing-dai-ma-8ms-/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值