Skip to content

Commit 166180a

Browse files
committed
Update 0977. 有序数组的平方.md
1 parent 3941413 commit 166180a

File tree

1 file changed

+52
-2
lines changed

1 file changed

+52
-2
lines changed

Solutions/0977. 有序数组的平方.md

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55

66
## 题目大意
77

8-
给你一个按「非递减顺序」排序的整数数组 `nums`
8+
**描述**给你一个按「非递减顺序」排序的整数数组 `nums`
99

10-
要求返回「每个数字的平方」组成的新数组,要求也按「非递减顺序」排序。
10+
**要求**:返回「每个数字的平方」组成的新数组,要求也按「非递减顺序」排序。
1111

1212
## 解题思路
1313

14+
### 思路 1:双指针
15+
1416
原数组是按「非递减顺序」排序的,可能会存在负数元素。但是无论是否存在负数,数字的平方最大值一定在原数组的两端。题目要求返回的新数组也要按照「非递减顺序」排序。那么,我们可以利用双指针,从两端向中间移动,然后不断将数的平方最大值填入数组。具体做法如下:
1517

1618
- 使用两个指针 `left``right``left` 指向数组第一个元素位置,`right` 指向数组最后一个元素位置。再定义 `index = len(nums) - 1` 作为答案数组填入顺序的索引值。`res` 作为答案数组。
@@ -27,8 +29,19 @@
2729

2830
返回答案数组 `res`
2931

32+
## 思路 2:排序算法
33+
34+
可以通过各种排序算法来对平方后的数组进行排序。以快速排序为例,具体步骤如下:
35+
36+
1. 遍历数组,将数组中各个元素变为平方项。
37+
2. 从数组中找到一个基准数。
38+
3. 然后将数组中比基准数大的元素移动到基准数右侧,比他小的元素移动到基准数左侧,从而把数组拆分为左右两个部分。
39+
4. 再对左右两个部分分别重复第 2、3 步,直到各个部分只有一个数,则排序结束。
40+
3041
## 代码
3142

43+
- 双指针:
44+
3245
```Python
3346
class Solution:
3447
def sortedSquares(self, nums: List[int]) -> List[int]:
@@ -50,3 +63,40 @@ class Solution:
5063
return res
5164
```
5265

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

Comments
 (0)