Skip to main content

rustgym/leetcode/
_360_sort_transformed_array.rs

1struct 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}