Skip to main content

pegitan/leetcode/
problem_15.rs

1use crate::Solution;
2
3impl Solution {
4    pub fn three_sum(mut nums: Vec<i32>) -> Vec<Vec<i32>> {
5        nums.sort();
6        let mut result: Vec<Vec<i32>> = Vec::new();
7        for x in 0..nums.len() {
8            if x > 0 && nums[x] == nums[x - 1] {
9                continue;
10            } else {
11                let mut left_iter = x + 1;
12                let mut right_iter = nums.len() - 1;
13                while left_iter < right_iter {
14                    let sum = nums[x] + nums[left_iter] + nums[right_iter];
15                    match sum.cmp(&0) {
16                        std::cmp::Ordering::Equal => {
17                            result.push(vec![nums[x], nums[left_iter], nums[right_iter]]);
18                            while left_iter + 1 < right_iter
19                                && nums[left_iter] == nums[left_iter + 1]
20                            {
21                                left_iter += 1;
22                            }
23                            while left_iter < right_iter - 1
24                                && nums[right_iter] == nums[right_iter - 1]
25                            {
26                                right_iter -= 1;
27                            }
28                            left_iter += 1;
29                            right_iter -= 1;
30                        }
31                        std::cmp::Ordering::Less => {
32                            left_iter += 1;
33                        }
34                        std::cmp::Ordering::Greater => {
35                            right_iter -= 1;
36                        }
37                    }
38                }
39            }
40        }
41        result
42    }
43}
44
45#[test]
46pub fn problem_15_test() {
47    for x in Solution::three_sum(vec![-1, 0, 1, 2, -1, -4]) {
48        assert_eq!(x.iter().sum::<i32>(), 0);
49    }
50}