Medium
Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]]
such that i != j
, i != k
, and j != k
, and nums[i] + nums[j] + nums[k] == 0
.
Notice that the solution set must not contain duplicate triplets.
Example 1:
Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]
Example 2:
Input: nums = []
Output: []
Example 3:
Input: nums = [0]
Output: []
Constraints:
0 <= nums.length <= 3000
-105 <= nums[i] <= 105
impl Solution {
pub fn three_sum(nums: Vec<i32>) -> Vec<Vec<i32>> {
let mut nums = nums.clone();
nums.sort();
let len = nums.len();
let mut result = Vec::new();
for i in 0..len - 2 {
if i > 0 && nums[i] == nums[i - 1] {
continue;
}
let mut l = i + 1;
let mut r = len - 1;
while l < r {
let sum = nums[i] + nums[l] + nums[r];
if sum < 0 {
l += 1;
} else if sum > 0 {
r -= 1;
} else {
result.push(vec![nums[i], nums[l], nums[r]]);
while l < r && nums[l] == nums[l + 1] {
l += 1;
}
while l < r && nums[r] == nums[r - 1] {
r -= 1;
}
l += 1;
r -= 1;
}
}
}
result
}
}