Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /