1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

解法一

/**

 * Note: The returned array must be malloced, assume caller calls free().

 */

int* twoSum(int* nums, int numsSize, int target, int* returnSize) {

    //先用暴力的方法来做 两层遍历 先确定第一数后面有没有相对应的值

    * returnSize=2;

    int i=0;

    int*loca=(int*)malloc(sizeof(int)*2);

    int*index=loca;

    int j=0;

    int temp=0;

    bool in=false;

    for(i=0;i<numsSize;i++){

        loca[0]=i;

        temp=nums[i];

        for(j=i+1;j<numsSize;j++){

            if(temp+nums[j]==target){

                loca[1]=j;

                in=true;

                return loca;

                break;

            }

        }

        if(in==true){

            break;

        }

    }

    return loca;

}

上面是用了暴力解法来做的 接下来我们用第二种方法

/**

 * Note: The returned array must be malloced, assume caller calls free().

 */

 //这里定义一个哈希表的结构

 typedef struct{

    int loca;

    int value;

    UT_hash_handle hh;//hash结构的需要

 }Hashform;

int* twoSum(int* nums, int numsSize, int target, int* returnSize) {

    //下面开始第二种做法  哈希表做法

    //哈希表的思想就是 创建一个表 把之前的数组的元素映射到

    //哈希表中 在通过检索哈希表 来找到与之相对应另外一个元素

   

    Hashform*in=NULL;//创建一个空的Hash表

    Hashform*found;

    //先利用一个临时变量来存储相减的差值 在hash表中找 有没有

    //如果没有 就把这个原数组的值和位置存入 hash中

    int i=0;

    //int j=0;

    int temp=target+1;

    for(i=0;i<numsSize;i++){

        temp=target-nums[i];

        HASH_FIND_INT(in,&temp,found);//利用c语言库函数查找在创建的哈希表中是否有这个元素的差值

        if(found){//如果找到了

         * returnSize=2;

            int*lo=malloc(sizeof(int)*2);

            lo[0]=found->loca;

            lo[1]=i;//说明在loca这个表中有 把位置传过去

            HASH_CLEAR(hh,in);//释放hash表

            return lo;

        }//下面就是没有在hash表中找到对应的元素

        //把原数组值和位置存入hash中方便下次查找

        found=malloc(sizeof(Hashform));

        found->value=nums[i];

        found->loca=i;

        //Hash函数存入

        HASH_ADD_INT(in,value,found);

    }

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值