57
57
58
58
<!-- solution:start -->
59
59
60
- ### 方法一
60
+ ### 方法一:数学 + 双指针
61
+
62
+ 根据数学知识可知,二次函数的图像是一条抛物线,当 $a \gt 0$ 时,抛物线开口向上,顶点为最小值;当 $a \lt 0$ 时,抛物线开口向下,顶点为最大值。
63
+
64
+ 由于数组 $\textit{nums}$ 已经排好序,我们可以使用双指针分别指向数组的两端,根据 $a$ 的正负决定从结果数组的头部还是尾部开始填充较大(或较小)的值。
65
+
66
+ 时间复杂度 $O(n),ドル空间复杂度 $O(n)$。其中 $n$ 是数组 $\textit{nums}$ 的长度。
61
67
62
68
<!-- tabs:start -->
63
69
@@ -68,31 +74,29 @@ class Solution:
68
74
def sortTransformedArray (
69
75
self , nums : List[int ], a : int , b : int , c : int
70
76
) -> List[int ]:
71
- def f (x ) :
77
+ def f (x : int ) -> int :
72
78
return a * x * x + b * x + c
73
79
74
80
n = len (nums)
75
- i, j, k = 0 , n - 1 , 0 if a < 0 else n - 1
76
- res = [0 ] * n
77
- while i <= j :
78
- v1, v2 = f(nums[i]), f(nums[j])
79
- if a < 0 :
80
- if v1 <= v2 :
81
- res[k ] = v1
81
+ i, j= 0 , n - 1
82
+ ans = [0 ] * n
83
+ for k in range (n) :
84
+ y1, y2 = f(nums[i]), f(nums[j])
85
+ if a > 0 :
86
+ if y1 > y2 :
87
+ ans[n - k - 1 ] = y1
82
88
i += 1
83
89
else :
84
- res[k ] = v2
90
+ ans[n - k - 1 ] = y2
85
91
j -= 1
86
- k += 1
87
92
else :
88
- if v1 >= v2:
89
- res[k] = v1
90
- i += 1
91
- else :
92
- res[k] = v2
93
+ if y1 > y2:
94
+ ans[k] = y2
93
95
j -= 1
94
- k -= 1
95
- return res
96
+ else :
97
+ ans[k] = y1
98
+ i += 1
99
+ return ans
96
100
```
97
101
98
102
#### Java
@@ -101,35 +105,33 @@ class Solution:
101
105
class Solution {
102
106
public int [] sortTransformedArray (int [] nums , int a , int b , int c ) {
103
107
int n = nums. length;
104
- int i = 0 , j = n - 1 , k = a < 0 ? 0 : n - 1 ;
105
- int [] res = new int [n];
106
- while (i <= j) {
107
- int v1 = f(a, b, c, nums[i]), v2 = f(a, b, c, nums[j]);
108
- if (a < 0 ) {
109
- if (v1 <= v2) {
110
- res[k] = v1;
111
- ++ i;
108
+ int [] ans = new int [n];
109
+ int i = 0 , j = n - 1 ;
110
+
111
+ IntUnaryOperator f = x - > a * x * x + b * x + c;
112
+
113
+ for (int k = 0 ; k < n; k++ ) {
114
+ int y1 = f. applyAsInt(nums[i]);
115
+ int y2 = f. applyAsInt(nums[j]);
116
+ if (a > 0 ) {
117
+ if (y1 > y2) {
118
+ ans[n - k - 1 ] = y1;
119
+ i++ ;
112
120
} else {
113
- res[k ] = v2 ;
114
- -- j ;
121
+ ans[n - k - 1 ] = y2 ;
122
+ j -- ;
115
123
}
116
- ++ k;
117
124
} else {
118
- if (v1 >= v2 ) {
119
- res [k] = v1 ;
120
- ++ i ;
125
+ if (y1 > y2 ) {
126
+ ans [k] = y2 ;
127
+ j -- ;
121
128
} else {
122
- res [k] = v2 ;
123
- -- j ;
129
+ ans [k] = y1 ;
130
+ i ++ ;
124
131
}
125
- -- k;
126
132
}
127
133
}
128
- return res;
129
- }
130
-
131
- private int f (int a , int b , int c , int x ) {
132
- return a * x * x + b * x + c;
134
+ return ans;
133
135
}
134
136
}
135
137
```
@@ -141,35 +143,35 @@ class Solution {
141
143
public:
142
144
vector<int > sortTransformedArray(vector<int >& nums, int a, int b, int c) {
143
145
int n = nums.size();
144
- int i = 0, j = n - 1, k = a < 0 ? 0 : n - 1;
145
- vector<int > res(n);
146
- while (i <= j) {
147
- int v1 = f(a, b, c, nums[ i] ), v2 = f(a, b, c, nums[ j] );
148
- if (a < 0) {
149
- if (v1 <= v2) {
150
- res[ k] = v1;
151
- ++i;
146
+ vector<int > ans(n);
147
+ int i = 0, j = n - 1;
148
+
149
+ auto f = [&](int x) {
150
+ return a * x * x + b * x + c;
151
+ };
152
+
153
+ for (int k = 0; k < n; k++) {
154
+ int y1 = f(nums[i]);
155
+ int y2 = f(nums[j]);
156
+ if (a > 0) {
157
+ if (y1 > y2) {
158
+ ans[n - k - 1] = y1;
159
+ i++;
152
160
} else {
153
- res [ k ] = v2 ;
154
- --j ;
161
+ ans[n - k - 1 ] = y2 ;
162
+ j-- ;
155
163
}
156
- ++k;
157
164
} else {
158
- if (v1 >= v2 ) {
159
- res [ k] = v1 ;
160
- ++i ;
165
+ if (y1 > y2 ) {
166
+ ans [k] = y2 ;
167
+ j-- ;
161
168
} else {
162
- res [ k] = v2 ;
163
- --j ;
169
+ ans [k] = y1 ;
170
+ i++ ;
164
171
}
165
- --k;
166
172
}
167
173
}
168
- return res;
169
- }
170
-
171
- int f(int a, int b, int c, int x) {
172
- return a * x * x + b * x + c;
174
+ return ans;
173
175
}
174
176
};
175
177
```
@@ -178,42 +180,111 @@ public:
178
180
179
181
``` go
180
182
func sortTransformedArray (nums []int , a int , b int , c int ) []int {
181
- n := len (nums)
182
- i , j , k := 0 , n-1 , 0
183
- if a >= 0 {
184
- k = n - 1
183
+ f := func (x int ) int {
184
+ return a*x*x + b*x + c
185
185
}
186
- res := make ([]int , n)
187
- for i <= j {
188
- v1 , v2 := f (a, b, c, nums[i]), f (a, b, c, nums[j])
189
- if a < 0 {
190
- if v1 <= v2 {
191
- res[k] = v1
186
+
187
+ n := len (nums)
188
+ ans := make ([]int , n)
189
+ i , j := 0 , n-1
190
+
191
+ for k := 0 ; k < n; k++ {
192
+ y1 , y2 := f (nums[i]), f (nums[j])
193
+ if a > 0 {
194
+ if y1 > y2 {
195
+ ans[n-k-1 ] = y1
192
196
i++
193
197
} else {
194
- res[k ] = v2
198
+ ans[n-k- 1 ] = y2
195
199
j--
196
200
}
197
- k++
198
201
} else {
199
- if v1 >= v2 {
200
- res[k] = v1
201
- i++
202
- } else {
203
- res[k] = v2
202
+ if y1 > y2 {
203
+ ans[k] = y2
204
204
j--
205
+ } else {
206
+ ans[k] = y1
207
+ i++
205
208
}
206
- k--
207
209
}
208
210
}
209
- return res
211
+ return ans
210
212
}
213
+ ```
211
214
212
- func f (a , b , c , x int ) int {
213
- return a*x*x + b*x + c
215
+ #### TypeScript
216
+
217
+ ``` ts
218
+ function sortTransformedArray(nums : number [], a : number , b : number , c : number ): number [] {
219
+ const f = (x : number ): number => a * x * x + b * x + c ;
220
+ const n = nums .length ;
221
+ let [i, j] = [0 , n - 1 ];
222
+ const ans: number [] = Array (n );
223
+ for (let k = 0 ; k < n ; ++ k ) {
224
+ const y1 = f (nums [i ]);
225
+ const y2 = f (nums [j ]);
226
+ if (a > 0 ) {
227
+ if (y1 > y2 ) {
228
+ ans [n - k - 1 ] = y1 ;
229
+ ++ i ;
230
+ } else {
231
+ ans [n - k - 1 ] = y2 ;
232
+ -- j ;
233
+ }
234
+ } else {
235
+ if (y1 > y2 ) {
236
+ ans [k ] = y2 ;
237
+ -- j ;
238
+ } else {
239
+ ans [k ] = y1 ;
240
+ ++ i ;
241
+ }
242
+ }
243
+ }
244
+ return ans ;
214
245
}
215
246
```
216
247
248
+ #### JavaScript
249
+
250
+ ``` js
251
+ /**
252
+ * @param {number[]} nums
253
+ * @param {number} a
254
+ * @param {number} b
255
+ * @param {number} c
256
+ * @return {number[]}
257
+ */
258
+ var sortTransformedArray = function (nums , a , b , c ) {
259
+ const f = x => a * x * x + b * x + c;
260
+ const n = nums .length ;
261
+ let [i, j] = [0 , n - 1 ];
262
+ const ans = Array (n);
263
+ for (let k = 0 ; k < n; ++ k) {
264
+ const y1 = f (nums[i]);
265
+ const y2 = f (nums[j]);
266
+ if (a > 0 ) {
267
+ if (y1 > y2) {
268
+ ans[n - k - 1 ] = y1;
269
+ ++ i;
270
+ } else {
271
+ ans[n - k - 1 ] = y2;
272
+ -- j;
273
+ }
274
+ } else {
275
+ if (y1 > y2) {
276
+ ans[k] = y2;
277
+ -- j;
278
+ } else {
279
+ ans[k] = y1;
280
+ ++ i;
281
+ }
282
+ }
283
+ }
284
+ return ans;
285
+ };
286
+ ```
287
+
217
288
<!-- tabs:end -->
218
289
219
290
<!-- solution:end -->
0 commit comments