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]
分析
可以考虑两头并进,从两边向中间前进,i和j分别指向最左边以及最右边,判断两个指针所指元素的绝对值大小,如果i大则新数组中加入它的平方并且i++,如果j大则新数组加入它的平方并且j--,直到i>j,输出新数组的翻转即可。
题解
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function(nums) {
let i=0, j=nums.length-1;
let newNums = [];
while(i<=j) {
if(Math.abs(nums[i])>=Math.abs(nums[j])) {
newNums.push(nums[i]*nums[i]);
i++;
} else {
newNums.push(nums[j]*nums[j]);
j--;
}
}
return newNums.reverse()
};
分析
时间复杂度:O(n)
空间复杂度:O(n)
优化 - 语法
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares = function(nums) {
const n = nums.length;
const ans = new Array(n).fill(0);
let l = 0, r = n - 1;
let i = n - 1;
while(l <= r){
if(nums[l] * nums[l] > nums[r] * nums[r]){
ans[i--] = nums[l] * nums[l++];
}else{
ans[i--] = nums[r] * nums[r--];
}
}
return ans;
};