通过万岁!!!
- 题目:要求对一个有序数组,每个数进行平方,并且还是有序的。注意这里面由负数。
- 基本思路:先将负数转换为正数,然后sort,然后再fori遍历,进行平方。时间复杂度就是排序的时间复杂度。
- 进阶思路:也就是时间复杂度为o(n)。其实核心就是我们找到正数和负数的分界线,然后双指针即可。找到以后,一个正数指针,一个负数指针,然后定义一个返回的数组ans,依次填充到ans中即可。
java代码——基本思路
class Solution {
public int[] sortedSquares(int[] nums) {
int len = nums.length;
for (int i = 0; i < nums.length; i++) {
if (nums[i] < 0) {
nums[i] = -nums[i];
} else {
break;
}
}
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
nums[i] *= nums[i];
}
return nums;
}
}
java代码——进阶思路
class Solution {
public int[] sortedSquares(int[] nums) {
int len = nums.length;
int positiveIdx = 0;
int[] ans = new int[len];
while (positiveIdx < len && nums[positiveIdx] < 0) {
positiveIdx++;
}
int negativeIdx = positiveIdx - 1;
int idx = 0;
while (negativeIdx >= 0 && positiveIdx < len) {// 都不会越界
if (-nums[negativeIdx] > nums[positiveIdx]) {
ans[idx++] = nums[positiveIdx] * nums[positiveIdx++];
} else {
ans[idx++] = nums[negativeIdx] * nums[negativeIdx--];
}
}
while (negativeIdx >= 0) {
ans[idx++] = nums[negativeIdx] * nums[negativeIdx--];
}
while (positiveIdx < len) {
ans[idx++] = nums[positiveIdx] * nums[positiveIdx++];
}
return ans;
}
}
- 总结:题目比较简单,主要是进阶思路。但是进阶思路的空间复杂度会有所提升,因为我们需要定义一个ans数组,用来存储我们要返回的内容。