pub fn three_sum(nums: Vec<i32>) -> Vec<Vec<i32>> {
algorithm_2(nums)
}
fn algorithm_2(nums: Vec<i32>) -> Vec<Vec<i32>> {
let mut res: Vec<Vec<i32>> = vec![];
if nums.len() >= 3 {
let mut sorted_nums = nums.clone();
sorted_nums.sort();
let mut i = 0;
while i < sorted_nums.len() - 1 {
let a = sorted_nums[i];
if i > 0 && sorted_nums[i - 1] == sorted_nums[i] {
i += 1;
continue;
}
let mut j = i + 1;
while j < sorted_nums.len() - 1 {
let b = sorted_nums[j];
if a + b > 0 {
break;
}
if i + 1 < j && b == sorted_nums[j - 1] {
j += 1;
continue;
}
let mut start = 0;
let mut end = sorted_nums[(j + 1)..].len() - 1;
while start < end {
let middle = (end + start) / 2;
if sorted_nums[(j + 1)..][middle] < -a - b {
start = middle + 1;
} else {
end = middle;
}
}
let k = j + 1 + start;
let c = sorted_nums[k];
if a + b + c == 0 {
res.push(vec![a, b, c]);
}
j += 1;
}
i += 1;
}
}
res
}