leetcode/
two_sum.rs

1//! # 1. 两数之和
2//!
3//! 难度 简单
4//!
5//! 给定一个整数数组 `nums` 和一个目标值 `target`,请你在该数组中找出和为目标值的那 **两个** 整数,并返回他们的数组下标。
6//!
7//! 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
8//!
9//!
10//!
11//! ## 示例:
12//!
13//! 给定 `nums = [2, 7, 11, 15]`, `target = 9`
14//!
15//! 因为 `nums[0] + nums[1] = 2 + 7 = 9`
16//! 所以返回 `[0, 1]`
17//!
18//! See [leetcode](https://leetcode-cn.com/problems/two-sum/)
19//!
20pub struct Solution;
21
22impl Solution {
23    pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
24        let mut state = std::collections::HashMap::with_capacity(nums.len());
25        for (i, n) in nums.iter().enumerate() {
26            if let Some(&v) = state.get(&(target - n)) {
27                if v != i {
28                    return vec![v as i32, i as i32];
29                }
30            }
31            state.insert(n, i);
32        }
33        vec![]
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    #[test]
42    fn test() {
43        let cases = vec![
44            (vec![], (vec![2,7,11,15], 91)),
45            (vec![0,1], (vec![2,7,11,15], 9)),
46        ];
47
48        for (expect, (nums, target)) in cases {
49            assert_eq!(expect, Solution::two_sum(nums, target));
50        }
51    }
52}