18. 四数之和
题目描述
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n a、b、c 和 d 互不相同 nums[a] + nums[b] + nums[c] + nums[d] == target 你可以按 任意顺序 返回答案 。
解题思路
有两个坑:
- 首先是n < 4的情况是存在的
- 其次四个数的加和可以超过i32的最大值
#![allow(unused)] fn main() { struct Solution {} impl Solution { pub fn four_sum(mut v: Vec<i32>, t: i32) -> Vec<Vec<i32>> { v.sort(); let n = v.len(); let mut res = vec![]; if n < 4 { return res } for i in 0..n-3 { if i > 0 && v[i] == v[i-1] { continue } for l in (i+3..n).rev() { if l < n - 1 && v[l] == v[l+1] { continue } let mut j = i + 1; let mut k = l - 1; while j < k { if v[i] as isize + v[j] as isize + v[k] as isize + v[l] as isize == t as isize { res.push(vec![v[i], v[j], v[k], v[l]]); 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[i] as isize + v[j] as isize + v[k] as isize + v[l] as isize) < t as isize { j += 1; } else { k -= 1; } } } } res } } }