Two Sum (哈希表)

思路是循环一次,每次都判断当前数组索引位置的值在不在hashtable里,不在的话,加入进去,key为数值,value为它的索引值;在的话,取得他的key,记为n(此时n一定小于循环变量i),接下来再在hashtable中查找(target-当前数值)这个数,利用了hashtable中查找元素时间为常数的优势,如果找到了就结束,此处需要注意的是,如果数组中有重复的值出现,那么第二次出现时就不会加入到hashtable里了,比如3,4,3,6;target=6时,当循环到第二个3时,也可以得到正确结果。

最终ac的代码如下:

class Solution {
public:
    vector<int> twoSum(vector<int> &numbers, int target) {
        vector<int > res;
        map<int,int> numMap;
        map<int,int>::iterator iter;
        int len=numbers.size();
        for(int i=0;i<len;i++)
        {
            iter=numMap.find(target-numbers[i]);
            if(iter!=numMap.end())
            {
                res.push_back(iter->second);
                res.push_back(i+1);
                return res;
            }
            else
            {
                numMap[numbers[i]]=i+1;
            }
        }

    }
};
时间: 2024-10-09 05:17:42

Two Sum (哈希表)的相关文章

[LeetCode] #1# Two Sum : 数组/哈希表/二分查找

一. 题目 1. Two SumTotal Accepted: 241484 Total Submissions: 1005339 Difficulty: Easy Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solutio

Java 哈希表运用-LeetCode 1 Two Sum

Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that

CODEVS2144 砝码称重2 (哈希表)

由于m很大,所以不能使用DP. 注意到n<30,直接暴力2^n会TLE. 所以,将砝码平均分成两份,对一份进行一次暴力,用哈希表存下可能的结果. 对下一份再进行一次暴力,在哈希表中搜索剩余的砝码重量是否存在,若存在则更新答案. 输出最小答案即可. Program CODEVS2144; const maxn=100; maxh=100007; var a:array[0..maxn] of longint; n,i,ans:longint; m:int64; h:array[0..maxh,1.

【点分治】【哈希表】bzoj2599 [IOI2011]Race

给nlog2n随便过的跪了,不得已弄了个哈希表伪装成nlogn(当然随便卡,好孩子不要学)…… 不过为啥哈希表的大小开小点就RE啊……?必须得超过数据范围一大截才行……谜 #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int f,c; inline void R(int &x){ c=0;f=1; for(;c<'0'||c>'9';c=getc

wikioi 1051哈希表

题目描述 Description 给出了N个单词,已经按长度排好了序.如果某单词i是某单词j的前缀,i->j算一次接龙(两个相同的单词不能算接龙). 你的任务是:对于输入的单词,找出最长的龙. 输入描述 Input Description 第一行为N(1<=N<=105).以下N行每行一个单词(由小写组成),已经按长度排序.(每个单词长度<50) 输出描述 Output Description 仅一个数,为最长的龙的长度. 样例输入 Sample Input 5 i a int a

_DataStructure_C_Impl:哈希表

#include<stdlib.h> #include<stdio.h> typedef int KeyType; //元素类型定义 typedef struct{ KeyType key; //keyword int hi; //冲突次数 }DataType; //哈希表类型定义 typedef struct{ DataType *data; int tableSize; //哈希表的长度 int curSize; //表中keyword个数 }HashTable; //构造一个

哈希表的基本操作

散列(hash)表/哈希表 1.关键字和和存储的地址建立一个对应的关系:Add = Hash(key): 2. 解决冲突方法: (1)开放定址法 – 探测方式:线性探测.二次探测. (2)再哈希法 (3)分离链接法 – 利用链表的方式. (4)公共溢出区法 3.存储结构:用顺序存储来构建哈希表.构建结构数组 注意:使用不同的哈希函数得到的冲突次数不同. ---------------------------------------------------------------------- 除

hdu 5183. Negative and Positive (哈希表)

Negative and Positive (NP) Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2177    Accepted Submission(s): 556 Problem Description When given an array (a0,a1,a2,?an−1) and an integer K, you are

HDU5183Negative and Positive (NP)(哈希表)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5183 题意: 给定一个长度为n的序列,判断是否存在 一段序列 sum(i,j)= a i ?a i+1 +a i+2 +?+(?1) j?i aj = k; 分析: 我们维护一段前缀和 sum[j]表示从开始到第j个元素, 即 sum(0,j); 然后我们将其加入到哈希表中 因为不同要么是正负正 ....,要么就是负正负....的结构 因此我们维护两个哈希表 表1插入 sum ,表2插入-sum;