Skip to content

Commit 5ca1b92

Browse files
committed
q977
1 parent 3ee9481 commit 5ca1b92

File tree

3 files changed

+100
-0
lines changed

3 files changed

+100
-0
lines changed

double-pointer/Cargo.toml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[package]
2+
name = "double-pointer"
3+
version = "0.1.0"
4+
edition = "2018"
5+
6+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7+
8+
[dependencies]

double-pointer/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
mod q977;

double-pointer/src/q977.rs

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
struct Solution ();
2+
impl Solution {
3+
pub fn sorted_squares(nums: Vec<i32>) -> Vec<i32> {
4+
let n = nums.len();
5+
6+
if n == 0 {
7+
return vec![]
8+
}
9+
10+
if n == 1 {
11+
return vec![nums[0] * nums[0]]
12+
}
13+
14+
if nums[0] >= 0 {
15+
return nums.iter().map(|x| x * x).collect()
16+
}
17+
18+
if *nums.last().unwrap() <= 0 {
19+
return nums.iter().rev().map(|x| x * x).collect()
20+
}
21+
22+
let mut result = vec![];
23+
let mut p1 = 0;
24+
let mut p2 = 1;
25+
let mut left_hit = false;
26+
let mut right_hit = false;
27+
28+
for _ in 0..n {
29+
if nums[p1] < 0 && nums[p2] >= 0 {
30+
break
31+
}
32+
p1 = p1 + 1;
33+
p2 = p2 + 1;
34+
}
35+
36+
loop {
37+
let l = nums[p1] * nums[p1];
38+
let r = nums[p2] * nums[p2];
39+
40+
if l >= r {
41+
result.push(r);
42+
if p2 == n-1 {
43+
right_hit = true;
44+
break
45+
}
46+
p2 = p2 + 1;
47+
}
48+
if l <= r {
49+
result.push(l);
50+
if p1 == 0 {
51+
left_hit = true;
52+
break
53+
}
54+
p1 = p1 - 1;
55+
}
56+
57+
}
58+
59+
if right_hit {
60+
for i in (0..p1+1).rev() {
61+
result.push(nums[i] * nums[i])
62+
}
63+
}
64+
65+
66+
67+
if left_hit {
68+
for i in p2..n {
69+
result.push(nums[i] * nums[i])
70+
}
71+
}
72+
73+
74+
result
75+
}
76+
77+
}
78+
79+
80+
#[cfg(test)]
81+
mod tests {
82+
use super::*;
83+
84+
#[test] fn test_1() {
85+
// assert_eq!(Solution::sorted_squares(vec![-4,-1,0,3,10]), vec![0,1,9,16,100]);
86+
assert_eq!(Solution::sorted_squares(vec![-3,0,2]), vec![0,4, 9])
87+
88+
}
89+
90+
91+
}

0 commit comments

Comments
 (0)