两数之和(力扣)

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

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

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum

此代码的时间复杂度为O(n),进行了算法的优化。其中:

1.  malloc 是 c 语言中的动态分配内存,result=(int*)malloc(sizeof(int)*2); malloc 函数返回的是 void\* 型,所以要强制类型转换成 int,在前面加上 (int *),才能给整型赋值,后面 (sizeof(int)*2) 的意思是分配两个 int 大小的空间;

2. HASH_ADD_INT,HASH_FIND_INT是力扣网站里面的内置函数。

C语言编写的代码如下图所示:

typedef struct hashTable{
	int key;   //数组原数值
    int val;   //数组对应的下标
    UT_hash_handle hh;   //使此结构体可以hashTable
} hashTable;           //给结构体取名为hashTable

hashTable* map = NULL;								//哈希表

void add(int ikey, int ival){						//向哈希表添加元素
    hashTable* temp = NULL;                      //定义了一个结构体temp并赋初值为空
  //若表中无ikey,则通过HASH_ADD_INT向表中添加元素,若表中有ikey,则修改它存储的元素值
    HASH_FIND_INT(map, &ikey, temp);       //查找表中是否有值为ikey(确定ikey的唯一性)
    if(temp == NULL){                     //如果temp为空
        temp = (hashTable*)malloc(sizeof(hashTable));   //给temp申请空间
        temp->key = ikey;                                //把ikey的值给temp里面的key
        temp->val = ival;                             //把ikey位置所在的下标给temp里面的val
        HASH_ADD_INT(map, key, temp);          //向哈希表添加元素
    }else{
        temp->val = ival;  //不满足if条件,则修改更改数组对应的下标
    }
}

hashTable* find(int ikey){							//在哈希表中查找目标元素
    hashTable* temp = NULL;
    HASH_FIND_INT(map, &ikey, temp);       //查找哈希表中值为ikey的元素
    return temp;
}

int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    map = NULL;
    int* res = (int*)malloc(sizeof(int) * 2);
    *returnSize = 2;
    for(int i=0; i < numsSize; ++i){				//遍历数组
        hashTable* temp = find(target - nums[i]);	//查找满足的元素
        if(temp == NULL){							//如果在哈希表中没有找到target - nums[i]
            add(nums[i], i);						//将该元素添加到哈希表
        }else{										//查找到满足的元素,返回下标
            res[0] = temp->val;						
            res[1] = i;
            break;
        }
    }

    return res;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值