[][src]Function leetcode_for_rust::cd0015_three_sum::three_sum

pub fn three_sum(nums: Vec<i32>) -> Vec<Vec<i32>>

Solutions

Approach 1: Iterator and use left and right item

  • Time complexity: O(n^2)

  • Space complexity: O(1)

  • Runtime: 24 ms

  • Memory: 4M

use std::collections::HashMap;

impl Solution {
    pub fn three_sum(mut nums: Vec<i32>) -> Vec<Vec<i32>> {
        if nums.len() < 3 { return vec![]; }

        let mut result: Vec<Vec<i32>> = Vec::new();
        let n_len = nums.len();
        nums.sort();

        for i in 0..n_len-2 {
            if i >= 1 && nums[i-1] == nums[i] { continue }

            let (mut left, mut right) = (i + 1, n_len - 1);

            while left < right {
                if left > i + 1 && nums[left - 1] == nums[left] { left += 1; continue }
                if right < n_len - 1 && nums[right] == nums[right + 1] { right -= 1; continue }

                if nums[i] + nums[left] + nums[right] > 0 {
                    right -= 1;
                } else if nums[i] + nums[left] + nums[right] < 0 {
                    left += 1;
                } else {
                    result.push(vec![nums[i], nums[left], nums[right]]);
                    left += 1;
                    right -= 1;
                }
            }
        }
        result
    }
}

Approach 2: HashSet

  • Time complexity: O(n^2)

  • Space complexity: O(n)

  • Runtime: 456 ms

  • Memory: 3.8M

use std::collections::HashSet;

impl Solution {
    pub fn three_sum(mut nums: Vec<i32>) -> Vec<Vec<i32>> {
        if nums.len() < 3 { return vec![]; }

        let mut result = vec![];
        nums.sort();

        for i in 0..nums.len()-2 {
            if i >= 1 && nums[i-1] == nums[i] { continue }
            let mut h_set = HashSet::new();
            for j in i+1..nums.len() {
                if h_set.contains(&nums[j]) {
                    if result.last() == Some(&vec![nums[i], -nums[i]-nums[j], nums[j]]) { continue }
                    result.push(vec![nums[i], -nums[i]-nums[j], nums[j]]);
                } else {
                    h_set.insert(-nums[i]-nums[j]);
                }
            }
        }

        result
    }
}