当前位置:首页 > 算法 > 正文内容

(LeetCode刷题)1. 两数之和

chanra1n9个月前 (03-19)算法625

题目

image.png


解答一:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
    for (int i = 0; i < numsSize; ++i) {
        for (int j = i + 1; j < numsSize; ++j) {
            if (nums[i] + nums[j] == target) {
                *returnSize = 2;
                int* res = (int*)malloc(sizeof(int) * (*returnSize));
                res[0] = i;
                res[1] = j;
                return res;
            }
        }
    }
    *returnSize = 0;
    return NULL;
}

非常简单的思路,使用两层循环对数组内的数进行两两相加,然后同target相比较。时间复杂度为O(n²)。

image.png

解答二:

int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
    int* ret = (int*)malloc(sizeof(int) * 2);
    *returnSize = 2;

    int hash[20011] = {0};

    for (int i = 0; i < numsSize; ++i) {
        long complement = target - nums[i];
        int index = ((complement + (long)1e9) % 20011);
        index = index < 0 ? index + 20011 : index; // ensure the index is positive

        if (hash[index]) {
            ret[0] = hash[index] - 1;
            ret[1] = i;
            return ret;
        }

        index = ((nums[i] + (long)1e9) % 20011); // similarly for nums[i]
        index = index < 0 ? index + 20011 : index;
        hash[index] = i + 1;
    }

    *returnSize = 0;
    return NULL;
}

此C函数首先创建一个大小为2的动态整形数组ret。然后,创建了大小为20011的哈希表,用于散列所有可能的输入。

然后,该函数遍历输入数组nums的每个元素。对于每个元素nums[i],首先计算其与目标数值的差值complement。然后,将差值加上后对20011取模得到哈希表的索引。取模是为了将任何在-到范围内的整数映射到一个正数索引。如果取模结果为负,为防止数组越界,需要加上模数以使得索引变为正数。

接下来,判断哈希表中该索引位置是否已有元素。如果有,说明找到了匹配项,将哈希表索引对应元素以及当前值所在的索引退回。接下来对nums[i]执行相等操作并存储到哈希表中,这是为了让后面的元素找到和为目标值的组合。

最后,如果在数组中没有找到匹配项,则将返回值的大小设为0,并返回NULL。

image.png

扫描二维码推送至手机访问。

版权声明:本文由我的FPGA发布,如需转载请注明出处。

本文链接:https://myfpga.cn/index.php/post/393.html

分享给朋友:

“(LeetCode刷题)1. 两数之和” 的相关文章

队列算法应用

队列算法应用

#include<stdio.h> #define MAXSIZE 100 typedef char DataType; typedef struct{     DataType ...

​Fibonacci数列的初步实现-递归

​Fibonacci数列的初步实现-递归

Fibonacci数列为:1、1、2、3、5、8、13、21、…,即 Fibonacci(1)=1; Fibonacci(2)=1;Fibonacci(n)=Fibonacci(n-1)+ Fibonacci(n-2)(当n>2时)。#include <stdio.h>...

C语言判断素数

C语言判断素数

素数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。思路:设m为要判断的数,m 不必被 2 ~ m-1 之间的每一个整数去除,只需被 2 ~  之间的每一个整数去除就可以了。如果 m 不能被 2 ~  间任一整数整除,m 必定是素数。例如判别 17...

常见算法的C语言实现(带题目、分析和答案) 穷举 递归 迭代 递推 分治 回溯 动态规划 贪心

常见算法的C语言实现(带题目、分析和答案) 穷举 递归 迭代 递推 分治 回溯 动态规划 贪心

1.1   基本思想1.1.1  穷举穷举(又称枚举)算法的基本思想是从所有可能的情况中搜索正确的答案。a)      题一查找数组中的两个元素,它们的和等于给定的目标值。给定一个包含 n 个整数的数组和一个目标值,找出...

(LeetCode刷题)2. 两数相加

(LeetCode刷题)2. 两数相加

题目解答一:简单实现思路:先遍历完两个链表,把各自的数字存入两个数组,然后对应位置的数相加,若结果大于10就进位到更高位的数。/**  * Definition for singly-linked list->  * s...