首页 > 其他分享 >两数之和

两数之和

时间:2023-06-03 09:23:48浏览次数:24  
标签:hash nums int 差值 哈希 下标 两数

 

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

 

使用哈希表实现:

1、遍历数组中每个数,判断目标值和当前差值是否在哈希表

2、如果存在,则返回差值对应的下标和当前值的下标

3、如果不存在,则将当前值和下标存入哈希表中,等待下次查询

使用C++实现:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> hash; // 哈希表存储每个出现过的值以及其对应的下标

        for (int i = 0; i < nums.size(); i++) {
            int complement = target - nums[i]; // 计算目标值与当前值的差值
            if (hash.count(complement)) { // 如果存在差值,则直接返回差值对应的下标和当前值的下标
                return {hash[complement], i};
            }
            hash[nums[i]] = i; // 将当前值及其下标存入哈希表中,等待下次查询
        }
        return {}; // 没有符合条件的数对,返回空数组
    }
};

 

 

使用C语言实现

typedef struct {
    int key;    // 存储数字
    int val;    // 存储下标
    UT_hash_handle hh; 
} hashTable;    // 定义哈希表结构体类型

int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    hashTable* hash = NULL;   // 声明一个哈希表
    int* res = (int*)malloc(sizeof(int) * 2); // 存储返回结果
    *returnSize = 0;    // 初始化返回结果的长度为 0

    for (int i = 0; i < numsSize; i++) {
        int complement = target - nums[i]; // 计算目标值与当前值的差值
        hashTable* tmp;
        HASH_FIND_INT(hash, &complement, tmp); // 查找哈希表中是否有差值所对应的数

        if(tmp != NULL)
     { res[0] = tmp->val; // 如果存在,则直接返回差值对应的下标和当前值的下标 res[1] = i; *returnSize = 2; return res; }
hashTable* element = (hashTable*)malloc(sizeof(hashTable)); // 如果不存在,则将当前值及其下标存入哈希表中 element->key = nums[i]; element->val = i; HASH_ADD_INT(hash, key, element); } return res; // 如果没有符合条件的数对,则返回空数组 }

  

 

标签:hash,nums,int,差值,哈希,下标,两数
From: https://www.cnblogs.com/Bingley-Z/p/17453293.html

相关文章

  • 代码随想录算法训练营第六天|哈希表理论基础、242.有效的字母异位词两个数组的交集、2
    242.有效的字母异位词力扣题目链接(opensnewwindow)给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。示例 1:输入:s="anagram",t="nagaram"输出:true示例2:输入:s="rat",t="car"输出:false说明: 你可以假设字符串只包含小写字母。思路:......
  • 力扣2. 两数相加
    给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0 开头。 示例1:输入:l1=[2,4,3],l2=[5,6......
  • 哈希表简单应用—两数之和
    这是一个简单题,本质上直接暴力求解也可以了。但是主要记录下哈希表的应用。给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不......
  • 代码随想录算法训练营第6天 | 哈希表理论基础, 242.有效的字母异位词, 349. 两个数组
     第三章 哈希表part01  今日任务  ●  哈希表理论基础 ●  242.有效的字母异位词 ●  349. 两个数组的交集 ●  202. 快乐数●  1. 两数之和     详细布置   哈希表理论基础  建议:大家要了解哈希表的内部实现原理,哈希函数,哈希......
  • 两数之和
    class Solution {public:    vector<int> twoSum(vector<int>& nums, int target) {        int n = nums.size();        vector<int>idxs;        for(int i = 0;i<n;i++) idxs.push_back(i);        sort(idxs.begi......
  • 两数相加
     /** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode() : val(0), next(nullptr) {} *     ListNode(int x) : val(x), next(nullptr) {} *     ......
  • 两数之和
    1.题目描述https://leetcode.cn/problems/two-sum/给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标示例1:输入:nums=[2,7,11,15],target=9输出:[0,1]解释:因为nums[0]+nums[1]==9,返回[0,1]难......
  • [Leetcode] 0001. 两数之和
    1.两数之和题目描述给定一个整数数组nums 和一个整数目标值target,请你在该数组中找出和为目标值target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。 示例1......
  • 1. 两数之和
    1.两数之和题目描述给定一个整数数组nums 和一个整数目标值target,请你在该数组中找出和为目标值target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。 示例......
  • 两数之和
    题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那 两个 整数,并返回它们的数组下标。需要注意的点:1、map用来存放遍历过的数据2、auto是自动推导数据类型3、key值和value值,key值不一定非要存地址,利用map的find()函数,对比的......