LeetCode 热题HOT100-两数之和(C语言)

简介: LeetCode 热题HOT100-两数之和(简单)两种方法解答

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;
}

哈希表代码中已经有了注释,可以仔细看看。这道题在这里就告一段落了

希望大家给个三连

给个关注(回关)你们的支持就是我最大的动力!

相关文章
|
2月前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
2月前
|
C++
Leetcode第一题(两数之和)
这篇文章介绍了解决LeetCode第一题“两数之和”的两种方法:暴力法和哈希表法,并提供了相应的C++代码实现。
41 0
Leetcode第一题(两数之和)
|
2月前
|
存储 C++ 容器
【LeetCode 13】1.两数之和
【LeetCode 13】1.两数之和
16 0
|
4月前
|
存储 索引
LeetCode------两数之和(3)【数组】
这篇文章介绍了LeetCode上的"两数之和"问题,提供了两种解法:一种是暴力求解法,通过双层循环遍历数组元素对查找两数之和为目标值的索引,时间复杂度为O(n^2);另一种是使用HashMap优化,通过存储元素值和索引,时间复杂度降低到O(n)。
LeetCode------两数之和(3)【数组】
|
4月前
|
算法
LeetCode第1题两数之和
该文章介绍了 LeetCode 第 1 题两数之和的解法,通过使用 HashMap 来记录数组元素及其下标,以 O(n)的时间复杂度解决问题。
|
4月前
|
JavaScript 前端开发 PHP
leetcode——两数之和【一】
leetcode——两数之和【一】
30 0
|
4月前
|
存储 算法 Java
LeetCode初级算法题:两数之和+斐波拉契数列多种java解法
LeetCode初级算法题:两数之和+斐波拉契数列多种java解法
44 0
|
6月前
|
存储 算法 索引
力扣经典150题第四十三题:两数之和
力扣经典150题第四十三题:两数之和
32 1
|
6月前
|
算法 测试技术 程序员
力扣经典150题第二十七题:两数之和 II - 输入有序数组
力扣经典150题第二十七题:两数之和 II - 输入有序数组
34 1
|
6月前
力扣-两数之和
力扣-两数之和