Skip to content

Commit 0359882

Browse files
committed
feat(double-pointer):leetcode#977
1 parent ee448da commit 0359882

File tree

2 files changed

+111
-0
lines changed

2 files changed

+111
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,3 +170,5 @@
170170
**回溯算法**
171171

172172
**双指针**
173+
174+
- [`leetcode#977.有序数组的平方`](./third-stage/double-pointer/leetcode977.md)
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
## 977. 有序数组的平方
2+
3+
**描述**
4+
5+
> 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
6+
7+
**实例**
8+
9+
```
10+
1、
11+
输入:nums = [-4,-1,0,3,10]
12+
输出:[0,1,9,16,100]
13+
解释:平方后,数组变为 [16,1,0,9,100]
14+
排序后,数组变为 [0,1,9,16,100]
15+
2、
16+
输入:nums = [-7,-3,2,3,11]
17+
输出:[4,9,9,49,121]
18+
```
19+
20+
> 提示:
21+
>
22+
> - 1 <= nums.length <= 104
23+
> - -104 <= nums[i] <= 104
24+
> - nums 已按 非递减顺序 排序
25+
26+
**思路**
27+
28+
```
29+
1、使用左右双指针
30+
2、先取左右指针绝对值,在进行比较
31+
将小的unshift到新数组中
32+
```
33+
34+
**实现**
35+
36+
```js
37+
/**
38+
* @param {number[]} nums
39+
* @return {number[]}
40+
*/
41+
var sortedSquares = function (nums) {
42+
let left = 0;
43+
let right = nums.length - 1;
44+
let ret = [];
45+
46+
while (left <= right) {
47+
const absLeft = Math.abs(nums[left]);
48+
const absRight = Math.abs(nums[right]);
49+
50+
if (absLeft > absRight) {
51+
ret.unshift(absLeft * absLeft);
52+
left++;
53+
} else {
54+
ret.unshift(absRight * absRight);
55+
right--;
56+
}
57+
}
58+
59+
return ret;
60+
};
61+
```
62+
63+
**实现-复杂度分析**
64+
`时间复杂度`:O(n),n 代表数组的长度,因为我们需要遍历完整的数组
65+
`空间复杂度`:O(1),除了只使用了返回的答案数组 ret,剩余的辅助空间变量均为常数,故渐进空间复杂度为 O(1)
66+
67+
**官方**
68+
69+
```java
70+
// java
71+
class Solution {
72+
public int[] sortedSquares(int[] nums) {
73+
int n = nums.length;
74+
int negative = -1;
75+
for (int i = 0; i < n; ++i) {
76+
if (nums[i] < 0) {
77+
negative = i;
78+
} else {
79+
break;
80+
}
81+
}
82+
83+
int[] ans = new int[n];
84+
int index = 0, i = negative, j = negative + 1;
85+
while (i >= 0 || j < n) {
86+
if (i < 0) {
87+
ans[index] = nums[j] * nums[j];
88+
++j;
89+
} else if (j == n) {
90+
ans[index] = nums[i] * nums[i];
91+
--i;
92+
} else if (nums[i] * nums[i] < nums[j] * nums[j]) {
93+
ans[index] = nums[i] * nums[i];
94+
--i;
95+
} else {
96+
ans[index] = nums[j] * nums[j];
97+
++j;
98+
}
99+
++index;
100+
}
101+
102+
return ans;
103+
}
104+
}
105+
```
106+
107+
**官方-复杂度分析**
108+
`时间复杂度`:O(n),其中 n 是数组 nnums 的长度。
109+
`空间复杂度`:O(1)。除了存储答案的数组以外,我们只需要维护常量空间。

0 commit comments

Comments
 (0)