15. 3Sum Medium

@problem@discussion
#Array#Two Pointers#Sorting



1/**
2 * [15] 3Sum
3 *
4 * Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] 
5 * such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0.
6 * Notice that the solution set must not contain duplicate triplets.
7 *  
8 * Example 1:
9 * Input: nums = [-1,0,1,2,-1,-4]
10 * Output: [[-1,-1,2],[-1,0,1]]
11 * Example 2:
12 * Input: nums = []
13 * Output: []
14 * Example 3:
15 * Input: nums = [0]
16 * Output: []
17 *  
18 * Constraints:
19 * 
20 * 0 <= nums.length <= 3000
21 * -10^5 <= nums[i] <= 10^5
22 * 
23 */
24pub struct Solution {}
25
26// problem: https://leetcode.com/problems/3sum/
27// discuss: https://leetcode.com/problems/3sum/discuss/?currentPage=1&orderBy=most_votes&query=
28
29// submission codes start here
30
31impl Solution {
32    pub fn three_sum(nums: Vec<i32>) -> Vec<Vec<i32>> {
33        let mut result: Vec<Vec<i32>> = Vec::new();
34        if nums.len() < 3 {return result;}
35        let mut data = nums.clone();
36        data.sort();
37
38        for i in 0..data.len() - 2 {
39            if i != 0 && data[i] == data[i - 1] {
40                continue;
41            }
42
43            let mut s = i + 1;
44            let mut e = data.len() - 1;
45            let sum = -data[i];
46            while s < e {
47                if data[s] + data[e] == sum {
48                    result.push(vec![data[i], data[s], data[e]]);
49                    while s < e && data[s] == data[s + 1] {s += 1}
50                    while s < e && data[e] == data[e - 1] {e -= 1}
51                    s += 1; e -= 1;
52                } else if data[s] + data[e] > sum {
53                    e -= 1;
54                } else {
55                    s += 1;
56                }
57            }
58        }
59
60        result
61    }
62}
63
64// submission codes end
65
66#[cfg(test)]
67mod tests {
68    use super::*;
69
70    #[test]
71    fn test_15() {
72        println!("got {:#?}", Solution::three_sum(vec![-1,0,1,2,-1,-4,1]));
73    }
74}
75


Back
© 2025 bowen.ge All Rights Reserved.