【JS】哈希法解决两数之和

思路

  • 使用哈希法:需要快速查询一个元素是否出现过,或者一个元素是否在集合里时

本题需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,符合要求的某元素是否遍历过,也就是 是否出现在这个集合。

  • 因为要返回下标,所以使用Map集合,key存放元素值,value存放元素下标

步骤

  1. 创建哈希表:初始化一个空的 Map,用于存储数组中每个元素的值及其对应的索引。

  2. 遍历数组:使用一个 for 循环逐个检查数组 nums 中的每个元素。

  3. 计算补数:对于当前元素,计算 target 与它的差值,称为补数。

  4. 查找补数:检查 Map 中是否已经包含了这个补数。

  5. 找到匹配:如果找到了补数,说明之前已经遍历过一个元素与当前元素相加可以得到 target,返回这两个元素的索引。

  6. 存储元素索引:如果当前元素的补数不在 Map 中,将当前元素和它的索引存入 Map

  7. 结束条件:如果遍历完整个数组都没有找到匹配的两个数,返回一个空数组。

题目

示例代码

var twoSum = function(nums, target) {
    // 创建一个 Map 对象来存储已经遍历过的数字及其索引
    let map = new Map();

    // 遍历数组的每个元素
    for (let i = 0; i < nums.length; i++) {
        // 计算当前元素与目标值的差值
        let complement = target - nums[i];

        // 检查 map 中是否已经存在与当前元素的差值相等的元素
        if (map.has(complement)) {
            // 如果存在,返回一个数组,包含 map 中存储的索引和当前元素的索引
            // map.get(complement) 是找到的与当前元素和为目标值的另一个元素的索引
            // i 是当前元素的索引
            return [map.get(complement), i];
        }

        // 将当前元素及其索引存入 map 中
        // 这样下次遍历时可以直接查找与之配对的元素
        map.set(nums[i], i);
    }

    // 如果遍历完数组都没有找到符合条件的两个数,返回空数组
    return [];
};

欢迎指正! 

下面是用哈希实现两数之和的C语言代码: ```c #include <stdio.h> #include <stdlib.h> #define HASH_SIZE 1000 typedef struct HashNode { int key; int value; struct HashNode* next; } HashNode; typedef struct { HashNode* data[HASH_SIZE]; } HashTable; HashTable* createHashTable() { HashTable* hashTable = (HashTable*)malloc(sizeof(HashTable)); for (int i = 0; i < HASH_SIZE; i++) { hashTable->data[i] = NULL; } return hashTable; } void addNode(HashTable* hashTable, int key, int value) { int hash = abs(key) % HASH_SIZE; HashNode* node = hashTable->data[hash]; while (node != NULL) { if (node->key == key) { node->value = value; return; } node = node->next; } HashNode* newNode = (HashNode*)malloc(sizeof(HashNode)); newNode->key = key; newNode->value = value; newNode->next = hashTable->data[hash]; hashTable->data[hash] = newNode; } int getValue(HashTable* hashTable, int key) { int hash = abs(key) % HASH_SIZE; HashNode* node = hashTable->data[hash]; while (node != NULL) { if (node->key == key) { return node->value; } node = node->next; } return -1; } int* twoSum(int* nums, int numsSize, int target, int* returnSize) { HashTable* hashTable = createHashTable(); for (int i = 0; i < numsSize; i++) { int complement = target - nums[i]; int index = getValue(hashTable, complement); if (index != -1) { int* result = (int*)malloc(sizeof(int) * 2); result[0] = index; result[1] = i; *returnSize = 2; return result; } addNode(hashTable, nums[i], i); } *returnSize = 0; return NULL; } int main() { int nums[] = {2, 7, 11, 15}; int target = 9; int returnSize; int* result = twoSum(nums, sizeof(nums) / sizeof(int), target, &returnSize); for (int i = 0; i < returnSize; i++) { printf("%d ", result[i]); } free(result); return 0; } ``` 注:本代码实现了哈希表的基本操作,包括创建哈希表、添加节点、获取节点值。在实现twoSum函数时,我们利用哈希表记录每个元素在数组中的下标,然后在遍历数组的同时查找哈希表中是否存在与当前元素相加等于目标值的元素,如果存在就返回它们的下标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值