15. 三数之和

题目描述

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

解题思路

#![allow(unused)]

fn main() {
struct Solution {}

impl Solution {
    pub fn three_sum(mut v: Vec<i32>) -> Vec<Vec<i32>> {
        v.sort();
        let mut ans = vec![];
        for i in 0..v.len() - 2 {
            if i > 0 && v[i] == v[i - 1] {
                continue;
            }
            let mut j = i + 1;
            let mut k = v.len() - 1;
            while j < k {
                if v[j] + v[k] + v[i] == 0 {
                    ans.push(vec![v[i], v[j], v[k]]);
                    j += 1;
                    while j < k && v[j] == v[j - 1] {
                        j += 1
                    }
                    k -= 1;
                    while j < k && v[k] == v[k + 1] {
                        k -= 1
                    }
                } else if v[j] + v[k] < -v[i] {
                    j += 1
                } else {
                    k -= 1
                }
            }
        }
        ans
    }
}
}

双指针做法还是想不到

学习感想

想不到用双指针

#![allow(unused)]

fn main() {
struct Solution {}

impl Solution {
    pub fn three_sum(mut nums: Vec<i32>) -> Vec<Vec<i32>> {
        nums.sort();
        let mut res: Vec<Vec<i32>> = Vec::new();
        for i in 0..nums.len() - 2usize {
            if i > 0 && nums[i] == nums[i-1usize] { continue }
            let mut left: usize = i + 1usize;
            let mut right: usize = nums.len() - 1usize;
            use std::cmp::Ordering;
            while left < right {
                let s: i32 = nums[i] + nums[left] + nums[right];
                match s.cmp(&0i32) {
                    Ordering::Less => left += 1usize,
                    Ordering::Greater => right -= 1usize,
                    _ => {
                        let to_push: Vec<i32> = vec![nums[i], nums[left], nums[right]];
                        if res.is_empty() || Some(&to_push) != res.last() {
                            res.push(to_push);
                        }
                        left += 1usize;
                        right -= 1usize;
                    }
                }
            }
        }
        res
    }
}

}