pegitan/leetcode/
problem_15.rs1use 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}