leetcode #1 twoSum问题:简单实用哈希表

因为不是计算机专业的,算法基础有点差,所以最近开始在leetcode上刷刷题补一补。

#1 问题链接:twoSum

问题描述:

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 your returned answers (both index1 and index2) are not zero-based.

You may assume that each input would have exactly one solution.

Input: numbers={2, 7, 11, 15}, target=9
Output: index1=1, index2=2

首先拿到题想到的第一个方法就是两层循环去找。迅速写出来提交,提示runtime exceed,也就是时间复杂度超出范围。

接着我看了下这个题目的tags,有array 和 hash ,那肯定是要用哈希表了。因此用哈希表,一层循环,复杂度O(N)。

C++代码:

class Solution {
public:
    vector<int> twoSum(vector<int> &numbers, int target) {
        vector<int> ret(2,-1);
        unordered_map<int, int> m;
        for(int i = 0; i < numbers.size(); i ++)
        {
            if(m.find(target-numbers[i]) == m.end())
                m[numbers[i]] = i;
            else
            {
                ret[0] = m[target-numbers[i]]+1;
                ret[1] = i+1;
                return ret;
            }
        }
    }
};

哈希表就是根据输入的数值去找数值在存储结构中的位置,因此用无序map存储<数值,索引>对。对输入的数字序列进行遍历,当数值 numbers[i]的“另一半”也就是与它相加可得target的那个数不在表中,就将numbers[i]加入表中,如果numbers[i]的“另一半”在表中,那就返回numbers[i]和它的“另一半”的索引。

另附上python代码:

class Solution:
    def twoSum(self,nums,target):
        table=dict()
        for i in range(len(nums)):
            if not table.has_key(target-nums[i]):
                table[nums[i]]=i
            else:
                return table[target-nums[i]]+1,i+1,
时间: 2024-12-10 10:40:24

leetcode #1 twoSum问题:简单实用哈希表的相关文章

简单的哈希表实现 C语言

简单的哈希表实现 简单的哈希表实现 原理 哈希表和节点数据结构的定义 初始化和释放哈希表 哈希散列算法 辅助函数strDup 哈希表的插入和修改 哈希表中查找 哈希表元素的移除 哈希表打印 测试一下 这是一个简单的哈希表的实现,用c语言做的. 原理 先说一下原理. 先是有一个bucket数组,也就是所谓的桶. 哈希表的特点就是数据与其在表中的位置存在相关性,也就是有关系的,通过数据应该可以计算出其位置. 这个哈希表是用于存储一些键值对(key -- value)关系的数据,其key也就是其在表中

简单的哈希表映射试验

对于很长的线性数据结构,进行搜索,可以用哈希表的方式. #include <iostream> #include <stdio.h> using namespace std; //数据类型 //注意:每一个数据节点,须绑定一个唯一的Key值 //这一点可以简单理解为:如果是工人信息,可以使用工号:学生信息,可以用学号 //设备信息,可以用设备编号 struct info {     int id;     char name[10]; }; info data[10]={0};//

建立简单的哈希表

#include<stdio.h> #include <stdlib.h> unsigned int SDBMHash(char *str) { unsigned int hash = 0; while (*str) { // equivalent to: hash = 65599*hash + (*str++); hash = (*str++) + (hash << 6) + (hash << 16) - hash; } return (hash &

【算法导论】简单哈希表的除法实现

哈希表,又名散列表,hashtable...云云,看似很高大上,其实不过是直接寻址的延伸而已.直接寻址为何物,看一个数组:a[10],那么取其中一个元素a[1],这就是直接寻址,直接去这个a+1的地址上,就找到了这个数值,时间复杂度为O(1).而哈希表的目的就是要让查找的时间复杂度尽量往O(1)上靠. 一.哈希表的最简单形式 假如有10000个数,比如0~9999,是可能出现的数字的集合,我们现在要将一段时间内,出现的数字,全部保存起来.如果出现的数字都不重复的情况下,我们可以使用一个长度为10

PHP实现哈希表

//一个简单的哈希表实现.... <?php class hashTable { private $collection; private $size = 100; //初始化哈希表的大小 public function __construct($size='') { $bucketsSize = is_int($size)?$size:$this->size; $this->collection = new SplFixedArray($bucketsSize); } //生成散列值,

哈希表的静态,动态,以及key/value形式

哈希是一种算法,将指定的数据按一定规律映射到一段空间内,又可以按照这种规律对它的值进行相应的操作,这一段空间可以称作哈希表,它的的查找速度要快于线性的数据结构,同时也快于表格队列等,所以它具有独特的优势,一般将哈希算法用于快速查找和加密算法. 对于最简单的哈希表,里面设置一个key,它决定将这个值存于哈希表的什么位置,同时把每个设置一个状态,如果有插入数据就将其设置为EXITS,其他操作同理,现在可以实现最简单的哈希表. namespace First { enum State { EMPTY,

哈希表之拉链法

前段时间理解了一下所谓的哈希表,一直以来在小博印象中哈希表是深奥的,是高大上的,但是接触原理以及看了一份demo之后我就觉得哈希表也就那样吧,接下来我把小博自己的理解尽量用最直白的语句来解释下~~~ ---------------------------------------------------------我是分界线,没错,很丑------------------------------------------------------------------ 首先什么是哈希表??? 散列表

映射的应用:哈希表,多维哈希表,多级映射实现字典

看了标题之后你会发现原来映射的功能竟然如此强劲 我们通常所用的map其实就是一棵红黑树,如果有平衡树问题能够用它来解决一定要用,不要手写了,因为红黑树的效率是非常棒的 先看几个定义: map<string,int> m1; map<string,map<string,int> >m2; multiset<string> s1; multimap<string,string> m3; 其中m1就是一个关联数组,为了模拟普通哈希表 (这里的所有的都是

[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