-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path4sum.rs
87 lines (70 loc) · 2.19 KB
/
4sum.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#![allow(dead_code, unused, unused_variables)]
fn main() {
println!("{:?}", Solution::four_sum(vec![1, 0, -1, 0, -2, 2], 0));
println!("{:?}", Solution::four_sum(vec![0, 0, 0, 0], 0));
println!("{:?}", Solution::four_sum(vec![-2, -1, -1, 1, 1, 2, 2], 0));
println!(
"{:?}",
Solution::four_sum(vec![1, -2, -5, -4, -3, 3, 3, 5], -11)
);
}
struct Solution;
impl Solution {
/// 第一个数加后面三个数集合
pub fn four_sum(nums: Vec<i32>, target: i32) -> Vec<Vec<i32>> {
let mut result = vec![];
if nums.len() < 4 {
return result;
}
let mut nums = nums;
nums.sort();
for i in 0..nums.len() {
if nums[i] > 0 && nums[i] > target {
break;
}
if i > 0 && nums[i] == nums[i - 1] {
continue;
}
let r = Self::three_sum(&nums[i + 1..], target - nums[i]);
for mut v in r.into_iter() {
v[0] = nums[i];
result.push(v);
}
}
result
}
fn three_sum(nums: &[i32], target: i32) -> Vec<Vec<i32>> {
let mut r = vec![];
if nums.len() < 3 {
return r;
}
for i in 0..nums.len() {
if nums[i] > 0 && nums[i] > target {
break;
}
if i > 0 && nums[i] == nums[i - 1] {
continue;
}
let (mut left, mut right) = (i + 1, nums.len() - 1);
while left < right {
let s = nums[i] + nums[left] + nums[right];
if s == target {
r.push(vec![0, nums[i], nums[left], nums[right]]);
left += 1;
right -= 1;
while left < right && nums[left] == nums[left - 1] {
left += 1;
}
while left < right && nums[right] == nums[right + 1] {
right -= 1;
}
} else if s < target {
left += 1;
} else {
right -= 1;
}
}
}
r
}
}