5
5
6
6
## 题目大意
7
7
8
- 给你一个按「非递减顺序」排序的整数数组 ` nums ` 。
8
+ ** 描述 ** : 给你一个按「非递减顺序」排序的整数数组 ` nums ` 。
9
9
10
- 要求返回 「每个数字的平方」组成的新数组,要求也按「非递减顺序」排序。
10
+ ** 要求 ** :返回 「每个数字的平方」组成的新数组,要求也按「非递减顺序」排序。
11
11
12
12
## 解题思路
13
13
14
+ ### 思路 1:双指针
15
+
14
16
原数组是按「非递减顺序」排序的,可能会存在负数元素。但是无论是否存在负数,数字的平方最大值一定在原数组的两端。题目要求返回的新数组也要按照「非递减顺序」排序。那么,我们可以利用双指针,从两端向中间移动,然后不断将数的平方最大值填入数组。具体做法如下:
15
17
16
18
- 使用两个指针 ` left ` 、` right ` 。` left ` 指向数组第一个元素位置,` right ` 指向数组最后一个元素位置。再定义 ` index = len(nums) - 1 ` 作为答案数组填入顺序的索引值。` res ` 作为答案数组。
27
29
28
30
返回答案数组 ` res ` 。
29
31
32
+ ## 思路 2:排序算法
33
+
34
+ 可以通过各种排序算法来对平方后的数组进行排序。以快速排序为例,具体步骤如下:
35
+
36
+ 1 . 遍历数组,将数组中各个元素变为平方项。
37
+ 2 . 从数组中找到一个基准数。
38
+ 3 . 然后将数组中比基准数大的元素移动到基准数右侧,比他小的元素移动到基准数左侧,从而把数组拆分为左右两个部分。
39
+ 4 . 再对左右两个部分分别重复第 2、3 步,直到各个部分只有一个数,则排序结束。
40
+
30
41
## 代码
31
42
43
+ - 双指针:
44
+
32
45
``` Python
33
46
class Solution :
34
47
def sortedSquares (self , nums : List[int ]) -> List[int ]:
@@ -50,3 +63,40 @@ class Solution:
50
63
return res
51
64
```
52
65
66
+ - 排序算法
67
+
68
+ ``` Python
69
+ import random
70
+
71
+ class Solution :
72
+ def randomPartition (self , arr : [int ], low : int , high : int ):
73
+ i = random.randint(low, high)
74
+ arr[i], arr[high] = arr[high], arr[i]
75
+ return self .partition(arr, low, high)
76
+
77
+ def partition (self , arr : [int ], low : int , high : int ):
78
+ i = low - 1
79
+ pivot = arr[high]
80
+
81
+ for j in range (low, high):
82
+ if arr[j] <= pivot:
83
+ i += 1
84
+ arr[i], arr[j] = arr[j], arr[i]
85
+ arr[i + 1 ], arr[high] = arr[high], arr[i + 1 ]
86
+ return i + 1
87
+
88
+ def quickSort (self , arr , low , high ):
89
+ if low < high:
90
+ pi = self .randomPartition(arr, low, high)
91
+ self .quickSort(arr, low, pi - 1 )
92
+ self .quickSort(arr, pi + 1 , high)
93
+
94
+ return arr
95
+
96
+ def sortedSquares (self , nums : List[int ]) -> List[int ]:
97
+ for i in range (len (nums)):
98
+ nums[i] = nums[i] * nums[i]
99
+
100
+ return self .quickSort(nums, 0 , len (nums) - 1 )
101
+ ```
102
+
0 commit comments