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

一. 题目

1. Two Sum
Total 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 solution.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

UPDATE (2016/2/13):
The return format had been changed to zero-based indices. Please read the above updated description carefully.

二. 题意

  • 给定一个数组和一个目标值
  • 找出数组中两个成员,两者之和为目标值
  • 假设一定存在一个解

三. 分析

  • 算法核心:

    • 三种方法:

      • 暴力搜索: O(n^2): 超时
      • 哈希表: O(n)
      • 先快排, 后二分查找: O(nlogn) + O(nlogn)
      • 先快排, 后使用双指针分别指向数组头和尾,同时双向遍历数组: O(nlogn) + O(n)
  • 实现细节:
    • 算法逻辑相对简单
    • 实现细节相对容易

四. 题解

  • 哈希表

    • 实现  
     1 class Solution {
     2 public:
     3     vector<int> twoSum(vector<int>& nums, int target) {
     4         vector<int> res;
     5         unordered_map<int, int> m;
     6
     7         for (int i = 0; i < nums.size(); i++) m[nums[i]] = i;
     8
     9         for (int i = 0; i < nums.size(); i++) {
    10             if (m.count(target - nums[i]) && m[target - nums[i]] != i) {
    11                 res.push_back(i);
    12                 res.push_back(m[target - nums[i]]);
    13                 return res;
    14             }
    15         }
    16
    17         return res;
    18     }
    19 };
    • 结果

  

      

  • 快排-二分查找

    • 实现
 1 class Solution {
 2 public:
 3     vector<int> twoSum(vector<int>& B, int target) {
 4         vector<int> res;
 5         vector<pair<int, int>> A;
 6
 7         for (int i = 0; i < B.size(); i++) {
 8             A.push_back(make_pair(B[i], i));
 9         }
10
11         my_qsort(A, 0, A.size() - 1);
12
13         for (int i = 0; i <= A.size(); i++) {
14             int left = i + 1, right = A.size() - 1;
15             while (left <= right) {
16                 int mid = left + (right - left) / 2;
17                 if (A[mid].first == target - A[i].first) {
18                     res.push_back(A[i].second);
19                     res.push_back(A[mid].second);
20                     return res;
21                 }
22                 if (A[mid].first < target - A[i].first) left = mid + 1;
23                 else right = mid - 1;
24             }
25         }
26
27         return res;
28     }
29 private:
30     void my_qsort(vector<pair<int, int>>& A, int l, int r) {
31         if (l > r) return;
32
33         pair<int, int> key = A[l];
34         int nl= l, nr = r;
35         while (l < r) {
36             pair<int, int> tmp;
37             while (A[r].first >= key.first && l < r) r--;
38             while (A[l].first <= key.first && l < r) l++;
39
40
41             tmp = A[l];
42             A[l] = A[r];
43             A[r] = tmp;
44         }
45         A[nl] = A[l];
46         A[l] = key;
47
48         my_qsort(A, nl, l - 1);
49         my_qsort(A, l + 1, nr);
50     }
51 };
    • 结果  

     

  • 快排-双指针

    • 实现
 1 class Solution {
 2 public:
 3     vector<int> twoSum(vector<int>& B, int target) {
 4         vector<int> res;
 5         vector<pair<int, int>> A;
 6
 7         for (int i = 0; i < B.size(); i++) {
 8             A.push_back(make_pair(B[i], i));
 9         }
10
11         int left = 0, right = A.size() - 1;
12         my_qsort(A, 0, A.size() - 1);
13
14         while (left < right) {
15             if (A[left].first + A[right].first < target) left++;
16             else if (A[left].first + A[right].first > target) right--;
17             else {res.push_back(A[left].second), res.push_back(A[right].second); return res;};
18         }
19
20         return res;
21     }
22 private:
23     void my_qsort(vector<pair<int, int>>& A, int l, int r) {
24         if (l > r) return;
25
26         pair<int, int> key = A[l];
27         int nl= l, nr = r;
28         while (l < r) {
29             pair<int, int> tmp;
30             while (A[r].first >= key.first && l < r) r--;
31             while (A[l].first <= key.first && l < r) l++;
32
33
34             tmp = A[l];
35             A[l] = A[r];
36             A[r] = tmp;
37         }
38         A[nl] = A[l];
39         A[l] = key;
40
41         my_qsort(A, nl, l - 1);
42         my_qsort(A, l + 1, nr);
43     }
44 };
    • 结果

     

时间: 2024-10-25 20:35:38

[LeetCode] #1# Two Sum : 数组/哈希表/二分查找的相关文章

perl5 第九章 关联数组/哈希表

第九章 关联数组/哈希表 by flamephoenix 一.数组变量的限制二.定义三.访问关联数组的元素四.增加元素五.创建关联数组六.从数组变量复制到关联数组七.元素的增删八.列出数组的索引和值九.用关联数组循环十.用关联数组创建数据结构  1.(单)链表  2.结构  3.树 一.数组变量的限制    在前面讲的数组变量中,可以通过下标访问其中的元素.例如,下列语句访问数组@array的第三个元素:    $scalar = $array[2];    虽然数组很有用,但它们有一个显著缺陷

哈希表之四查找及分析

哈希表查找和哈希表的构造过程基本一致,见下图 哈希表插入和查询的例子(先省略) (1)哈希表虽然建立了关键字和记录的存储位置之间的映射关系,但是由于冲突,导致是一个多对一的映射, 所以,哈希表的查找效率是平均查找长度: (2)查找过程中徐鹤给定值进行比较的关键字的个数取决于三个因素:哈希函数,处理冲突的方法和装填因子 (3)一般情况下,处理冲突方法相同的哈希表,其平均查找长度依赖于哈希表的装填因子. 哈希表装填因子的定义: 表示哈希表的装填程度,越小,发生冲突的可能性就越小:反之越大,表示已填入

(转载)查找三 哈希表的查找

查找三 哈希表的查找 目录 要点 哈希表和哈希函数 在记录的存储位置和它的关键字之间是建立一个确定的对应关系(映射函数),使每个关键字和一个存储位置能唯一对应.这个映射函数称为哈希函数,根据这个原则建立的表称为哈希表(Hash Table),也叫散列表. 以上描述,如果通过数学形式来描述就是: 若查找关键字为 key,则其值存放在 f(key) 的存储位置上.由此,不需比较便可直接取得所查记录. 注:哈希查找与线性表查找和树表查找最大的区别在于,不用数值比较. 冲突 若 key1 ≠ key2

查找三 哈希表的查找

要点 哈希表和哈希函数 在记录的存储位置和它的关键字之间是建立一个确定的对应关系(映射函数),使每个关键字和一个存储位置能唯一对应.这个映射函数称为哈希函数,根据这个原则建立的表称为哈希表(Hash Table),也叫散列表. 以上描述,如果通过数学形式来描述就是: 若查找关键字为 key,则其值存放在 f(key) 的存储位置上.由此,不需比较便可直接取得所查记录. 注:哈希查找与线性表查找和树表查找最大的区别在于,不用数值比较. 冲突 若 key1 ≠ key2 ,而 f(key1) = f

HDU 5878 I Count Two Three (打表+二分查找) -2016 ICPC 青岛赛区网络赛

题目链接 题意:给定一个数n,求大于n的第一个只包含2357四个因子的数(但是不能不包含其中任意一种),求这个数. 题解:打表+二分即可. #include <iostream> #include <math.h> #include <stdio.h> #include<algorithm> using namespace std; long long data[1000000],tot=0; int main() { long long maxn = 10

实现有序表二分查找

二分查找递归与非递归 //算法7.3 折半查找 #include<iostream> using namespace std; #define MAXSIZE 100 #define OK 1; typedef struct{ int key;//关键字域 }ElemType; typedef struct{ ElemType *R; int length; }SSTable; int InitList_SSTable(SSTable &L) { L.R=new ElemType[MA

1. Two Sum【数组|哈希表】

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 solution. 版本1:O(n^2)  [暴力 原始版本]O(1) classSolution(object): def twoSum(self, nums, target):

leetCode 1. Two Sum 数组

1. Two Sum 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 solution. Example: Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + n

[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