LeetCode 热题HOT100-两数之和(C语言)
作为一名程序语言的学习者,刷力扣我想是必要经历的一条路,所以我也在这里分享刷题后所得知识,也可以帮助更多人理解题意。
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
唯For熟尔
可以看到题意中给了一个整数数组nums和目标值target
要求在数组里面找出两个数来实现 x+y=target
1.首先先观察所提供的代码
额外条件:给出了数组的长度 numsSize
还有一个我们暂时不知道用处的 int* returnSize(后面再看)
2.再注意看这段示例,很明显是返回了一个数组来存储nums中两个数的下标
那没什么说法,开空间整就完了
int *a = (int*)malloc(sizeof(int)*2);
到这里就分析得差不多了,很明显,要对nums进行一次遍历,找到合适的数,那万年不变我们就用for来解决,我们只会for,也是没有问题的,遍历出两个数,自然要两个for,就定义两个变量来实现
int i,j;
for(i=0;i<numsSize;i++){
for(j=i+1;j<numsSize;j++){
}
}
因为两个数不能重复出现,也就是不允许 x+x=target 即数组第一个数不可能再从 i
出发,而数组最后一个数也没必要再与任何一个数组合,这时候我们就可以直接令 j=i+1
省去判断两个数是否相等的步骤,而且当i位于倒数第二个数时,j处于最后一个数,又可以再减少一个步骤。
运用if找到那两个天选之子,填充好代码
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
int *a = (int*)malloc(sizeof(int)*2); /*整一个数组出来*/
int i,j;
for(i=0;i<numsSize;i++){
for(j=i+1;j<numsSize;j++){
if(nums[i]+nums[j] == target){ /*判断条件对应题意*/
a[0] = i;
a[1] = j;
*returnSize = 2;
return a;
}
}
}
return 0;
}
- 到这里我们来填回上面留下的一个坑:returnSize有何作用?
我们可以思考一下,我们是不是要返回两个已经存到了a[ ]这个数组的两个数,那就可以在这里结尾用returnSize表示我要返回的a[ ]的长度,同时后面为什么等于2就解释得通了
数组里面没有结束符号,它得知道你的数组长度才能判断内容
当然可能不理解为什么要出现在循环里,其实,我们放在外边也是可以的,在创建时就把这事解决了
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int *a = (int*)malloc(sizeof(int)*2);
*returnSize = 2; /*放在这里也是没有问题的,运行成功*/
int i,j;
for(i=0;i<numsSize;i++){
for(j=i+1;j<numsSize;j++){
if(nums[i]+nums[j] == target){
a[0] = i;
a[1] = j;
return a;
}
}
}
return 0;
}
哈希表
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
// 哈希节点
typedef struct {
int key;
int value;
UT_hash_handle hh;
} hash_node;
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int* ans = (int*)malloc(sizeof(int) * 2); // 题目给出答案唯一 所以只有2个下标
if (NULL == ans) exit(-1);
*returnSize = 2; // 返回数组大小赋值
// head为头节点
hash_node* head = NULL, *cur, *tmp;
// 循环nums把 target - nums[i] 存入哈希表
for (int i = 0; i < numsSize; i++) {
hash_node* tmp = NULL;
HASH_FIND_INT(head, nums + i, tmp); // 查表
if (NULL != tmp) { // 如果 当前nums[i]元素在哈希表,说明之前已经找到了另一半
ans[0] = tmp->value; // 取出之前下标
ans[1] = i; // 当前下标
break;
}
// 不在哈希表就把 target - nums[i] 存入哈希表
tmp = (hash_node*)malloc(sizeof(hash_node));
if (NULL == tmp) exit(-1);
tmp->key = target - nums[i];
tmp->value = i;
HASH_ADD_INT(head, key, tmp);
}
// 释放哈希表所有节点
HASH_ITER(hh, head, cur, tmp) {
HASH_DEL(head, cur);
free(cur);
}
return ans;
}
哈希表代码中已经有了注释,可以仔细看看。这道题在这里就告一段落了
希望大家给个三连
给个关注(回关)你们的支持就是我最大的动力!