LeetCode刷题03-数组-977.有序数组的平方
题目
给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
示例1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例2:
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]
提示:
- 1 <= nums.length <= 104
- -104 <= nums[i] <= 104
- nums 已按非递减顺序排序
进阶:
- 请你设计时间复杂度为** O(n) **的算法解决本问题
代码:
解法1:
class Solution {
public int[] sortedSquares(int[] nums) {
// 初始化更新指针:
int updateIndex = 0;
// 初始化遍历指针:
int normalIndex = 0;
// 初始化平方值最小值指针
int minIndex = 0;
// 将数组平方化
for(int i = 0; i < nums.length; i++) {
nums[i] = nums[i] * nums[i];
}
// 使用双指针法对数组进行排序
while(updateIndex < nums.length) {
// minIndex指向最小值处
while(normalIndex < nums.length) {
if(nums[normalIndex] <= nums[minIndex]) {
minIndex = normalIndex;
}
normalIndex++;
}
// updateIndex处进行更新,保证[0,updateIndex]处为非递减顺序
int tmp = nums[updateIndex];
nums[updateIndex] = nums[minIndex];
nums[minIndex] = tmp;
updateIndex++;
normalIndex = updateIndex;
minIndex = normalIndex;
}
return nums;
}
}
解法2(双指针优化):
由于nums[]为非递减数组,则其元素平方最大值定在数组的两端,故采用相向双指针,并利用**result[]**进行结果记录。
class Solution {
public int[] sortedSquares(int[] nums) {
// 初始化起始指针:
int startIndex = 0;
// 初始化末端指针:
int endIndex = nums.length - 1;
// 初始化结果数组
int[] result = new int[nums.length];
// 初始化结果数组索引
int i = nums.length - 1;
while (i >= 0) {
int startNum = nums[startIndex] * nums[startIndex];
int endNum = nums[endIndex] * nums[endIndex];
if(startNum > endNum) {
result[i--] = startNum;
startIndex++;
}else{
result[i--] = endNum;
endIndex--;
}
}
return result;
}
}