- Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path3sum-closest.rs
65 lines (54 loc) · 1.73 KB
/
3sum-closest.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
#![allow(dead_code, unused, unused_variables)]
fnmain(){}
structSolution;
implSolution{
/// 暴力破解法
pubfnthree_sum_closest1(nums:Vec<i32>,target:i32) -> i32{
letmut sum:i32 = nums[0..3].iter().sum();
for i in0..nums.len(){
for j in i + 1..nums.len(){
for k in j + 1..nums.len(){
let s = nums[i] + nums[j] + nums[k];
if s == target {
return s;
}
sum = if(sum - target).abs() > (s - target).abs(){
s
}else{
sum
};
}
}
}
sum
}
/// 排序后,和是递增的
pubfnthree_sum_closest(nums:Vec<i32>,target:i32) -> i32{
letmut nums = nums;
nums.sort();
letmut sum:i32 = nums[..3].iter().sum();
// 因为排序后递增,所以前三个数的和是最小的,当前三个数的和都大于target时,其他数的和肯定大于target
if sum > target {
return sum;
}
for i in0..nums.len(){
let(mut left,mut right) = (i + 1, nums.len() - 1);
while left < right {
let s = nums[i] + nums[left] + nums[right];
if s == target {
return s;
}elseif s > target {
right -= 1;
}else{
left += 1;
}
sum = if(s - target).abs() > (sum - target).abs(){
sum
}else{
s
};
}
}
sum
}
}