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

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

LeetCode 热题HOT100-两数之和(C语言)_第1张图片
作为一名程序语言的学习者,刷力扣我想是必要经历的一条路,所以我也在这里分享刷题后所得知识,也可以帮助更多人理解题意。

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

LeetCode 热题HOT100-两数之和(C语言)_第2张图片

唯For熟尔

可以看到题意中给了一个整数数组nums和目标值target
要求在数组里面找出两个数来实现 x+y=target

1.首先先观察所提供的代码

LeetCode 热题HOT100-两数之和(C语言)_第3张图片

额外条件:给出了数组的长度 numsSize
还有一个我们暂时不知道用处的 int* returnSize(后面再看)

LeetCode 热题HOT100-两数之和(C语言)_第4张图片

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

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

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

你可能感兴趣的:(数据结构,算法,c语言,经验分享,学习)