Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit fee6e90

Browse files
author
Zhang Xiaodong
committed
solve 18
1 parent 0bfdd91 commit fee6e90

File tree

2 files changed

+118
-0
lines changed

2 files changed

+118
-0
lines changed

src/solution/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ mod s0014_longest_common_prefix;
1313
mod s0015_3sum;
1414
mod s0016_3sum_closest;
1515
mod s0017_letter_combinations_of_a_phone_number;
16+
mod s0018_4sum;

src/solution/s0018_4sum.rs

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
/**
2+
* [18] 四数之和
3+
*
4+
* 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
5+
*
6+
* 0 <= a, b, c, d < n
7+
* a、b、c 和 d 互不相同
8+
* nums[a] + nums[b] + nums[c] + nums[d] == target
9+
*
10+
* 你可以按 任意顺序 返回答案 。
11+
*
12+
* 示例 1:
13+
*
14+
* 输入:nums = [1,0,-1,0,-2,2], target = 0
15+
* 输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
16+
*
17+
* 示例 2:
18+
*
19+
* 输入:nums = [2,2,2,2,2], target = 8
20+
* 输出:[[2,2,2,2]]
21+
*
22+
*
23+
* 提示:
24+
*
25+
* 1 <= nums.length <= 200
26+
* -10^9 <= nums[i] <= 10^9
27+
* -10^9 <= target <= 10^9
28+
*
29+
*/
30+
pub struct Solution {}
31+
32+
// problem: https://leetcode.cn/problems/4sum/
33+
// discuss: https://leetcode.cn/problems/4sum/discuss/?currentPage=1&orderBy=most_votes&query=
34+
35+
// submission codes start here
36+
37+
impl Solution {
38+
pub fn four_sum(nums: Vec<i32>, target: i32) -> Vec<Vec<i32>> {
39+
if nums.len() < 4 {
40+
return vec![];
41+
}
42+
let mut nums = nums;
43+
nums.sort();
44+
45+
let mut res: Vec<Vec<i32>> = vec![];
46+
47+
let target = target as i64;
48+
let mut i = 0;
49+
while i < nums.len() - 3 {
50+
let mut j = i + 1;
51+
while j < nums.len() - 2 {
52+
let mut k = j + 1;
53+
let mut l = nums.len() - 1;
54+
while k < l {
55+
let curr: i64 = nums[i] as i64 + nums[j] as i64 + nums[k] as i64 + nums[l] as i64;
56+
if curr == target {
57+
res.push(vec![nums[i], nums[j], nums[k], nums[l]]);
58+
k = Self::find_next_uniq(&nums, k, true);
59+
l = Self::find_next_uniq(&nums, l, false);
60+
} else if curr > target {
61+
l = Self::find_next_uniq(&nums, l, false);
62+
} else {
63+
k = Self::find_next_uniq(&nums, k, true);
64+
}
65+
}
66+
j = Self::find_next_uniq(&nums, j, true);
67+
}
68+
i = Self::find_next_uniq(&nums, i, true);
69+
}
70+
71+
res
72+
}
73+
74+
#[inline(always)]
75+
fn find_next_uniq(nums: &[i32], idx: usize, forward: bool) -> usize {
76+
let curr = nums[idx];
77+
let mut i = idx;
78+
if forward {
79+
while i < nums.len() && nums[i] == curr {
80+
i += 1;
81+
}
82+
} else {
83+
while i > 0 && nums[i] == curr {
84+
i -= 1;
85+
}
86+
}
87+
i
88+
}
89+
}
90+
91+
// submission codes end
92+
93+
#[cfg(test)]
94+
mod tests {
95+
use std::vec;
96+
97+
use super::*;
98+
99+
#[test]
100+
fn test_18() {
101+
assert_eq!(
102+
Solution::four_sum(vec![1, 0, -1, 0, -2, 2], 0),
103+
vec![vec![-2, -1, 1, 2], vec![-2, 0, 0, 2], vec![-1, 0, 0, 1]]
104+
);
105+
106+
assert_eq!(
107+
Solution::four_sum(vec![2, 2, 2, 2, 2], 8),
108+
vec![vec![2, 2, 2, 2]]
109+
);
110+
111+
let emptyvec: Vec<Vec<i32>> = vec![];
112+
assert_eq!(
113+
Solution::four_sum(vec![1000000000, 1000000000, 1000000000, 1000000000], -294967296),
114+
emptyvec
115+
);
116+
}
117+
}

0 commit comments

Comments
 (0)