1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//! Two Sum [leetcode: two_sum](https://leetcode.com/problems/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, and you may not use the same element twice.
//!
//! ***Example:***
//!
//! ```
//! Given nums = [2, 7, 11, 15], target = 9,
//!
//! Because nums[0] + nums[1] = 2 + 7 = 9,
//!
//! return [0, 1].
//! ```

use std::collections::HashMap;
/// # Solutions
///
/// # Approach 1: One-pass Hash Table
///
/// * Time complexity: O(n)
///
/// * Space complexity: O(n)
///
/// ```rust
/// use std::collections::HashMap;
///
/// impl Solution {
///     pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
///         if nums.len() < 2 {
///             return vec![];
///         }
///
///         let mut positon = HashMap::new();
///         for(i, num) in nums.iter().enumerate() {
///             if positon.contains_key(num) {
///                 return vec![positon[num] as i32, i as i32];
///             } else {
///                 positon.insert(target - num, i);
///             }
///         }
///
///         return vec![];
///     }
/// }
/// ```
///
/// # Approach 2: Brute Force
///
/// * Time complexity: O(n^2)
///
/// * Space complexity: O(1)
///
/// ```rust
/// impl Solution {
///     pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
///         if nums.len() < 2 {
///             return vec![];
///         }
///
///         let mut v: Vec<i32> = vec![];
///         for i in 0..nums.len() {
///             let n = target - nums[i];
///             for j in (i+1)..nums.len() {
///                 if n == nums[j] {
///                     v.push(i as i32);
///                     v.push(j as i32);
///                     return v;
///                 }
///             }
///         }
///
///         v
///     }
/// }
///
pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
    if nums.len() < 2 {
        return vec![];
    }

    let mut positon = HashMap::new();
    for(i, num) in nums.iter().enumerate() {
        if positon.contains_key(num) {
            return vec![positon[num] as i32, i as i32];
        } else {
            positon.insert(target - num, i);
        }
    }

    return vec![];
}