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)的算法解决本问题
想法
看到题目最简单粗暴的方法肯定是遍历数组求平方然后排序,哈哈这么写就没有锻炼算法的必要了
[-4,-1,0,3,10]
[-10,-1,0,3,4]
因为是先平方,所以负数的平方之后也为正数,那么最大的数肯定是在数组的最左侧或者最右侧,那么就可以用双指针
实现
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function(nums) {
let arr = []
let l = 0, r = nums.length - 1;
while(l <= r){
let lResult = Math.pow(nums[l],2)
let rResult = Math.pow(nums[r],2)
if(lResult > rResult){
arr.unshift(lResult)
l++
}else if(lResult < rResult){
arr.unshift(rResult)
r --;
}else{
if (l === r) {
arr.unshift(lResult);
} else {
arr.unshift(lResult, rResult);
}
l++;
r--;
}
}
return arr
};
在题解里面看到一个更优雅的写法,分享如下
var sortedSquares = function(nums) {
const n = nums.length;
const ans = Array(n);
let i = 0, j = n - 1;
for (let p = n - 1; p >= 0; p--) {
const x = nums[i] * nums[i];
const y = nums[j] * nums[j];
if (x > y) {
ans[p] = x;
i++;
} else {
ans[p] = y;
j--;
}
}
return ans;
};