rustgym/leetcode/
_360_sort_transformed_array.rs1struct Solution;
2use std::cmp::Ordering::*;
3use std::collections::VecDeque;
4
5impl Solution {
6 fn sort_transformed_array(nums: Vec<i32>, a: i32, b: i32, c: i32) -> Vec<i32> {
7 match a.cmp(&0) {
8 Equal => {
9 if b >= 0 {
10 let res: Vec<i32> = nums.into_iter().map(|x| Self::f(x, a, b, c)).collect();
11 res
12 } else {
13 let mut res: Vec<i32> = nums.into_iter().map(|x| Self::f(x, a, b, c)).collect();
14 res.reverse();
15 res
16 }
17 }
18 Greater => {
19 let mut queue = VecDeque::from(nums);
20 let mut res = vec![];
21 while queue.len() > 1 {
22 let front = queue.front().unwrap();
23 let back = queue.back().unwrap();
24 let front = Self::f(*front, a, b, c);
25 let back = Self::f(*back, a, b, c);
26 if front > back {
27 queue.pop_front();
28 res.push(front);
29 } else {
30 queue.pop_back();
31 res.push(back);
32 }
33 }
34 let last = queue.pop_front().unwrap();
35 let last = Self::f(last, a, b, c);
36 res.push(last);
37 res.reverse();
38 res
39 }
40 Less => {
41 let mut queue = VecDeque::from(nums);
42 let mut res = vec![];
43 while queue.len() > 1 {
44 let front = queue.front().unwrap();
45 let back = queue.back().unwrap();
46 let front = Self::f(*front, a, b, c);
47 let back = Self::f(*back, a, b, c);
48 if front < back {
49 queue.pop_front();
50 res.push(front);
51 } else {
52 queue.pop_back();
53 res.push(back);
54 }
55 }
56 let last = queue.pop_front().unwrap();
57 let last = Self::f(last, a, b, c);
58 res.push(last);
59 res
60 }
61 }
62 }
63 fn f(x: i32, a: i32, b: i32, c: i32) -> i32 {
64 a * x * x + b * x + c
65 }
66}
67
68#[test]
69fn test() {
70 let nums = vec![-4, -2, 2, 4];
71 let a = 1;
72 let b = 3;
73 let c = 5;
74 let res = vec![3, 9, 15, 33];
75 assert_eq!(Solution::sort_transformed_array(nums, a, b, c), res);
76 let nums = vec![-4, -2, 2, 4];
77 let a = -1;
78 let b = 3;
79 let c = 5;
80 let res = vec![-23, -5, 1, 7];
81 assert_eq!(Solution::sort_transformed_array(nums, a, b, c), res);
82}