有序数组的平方

给你一个按非递减顺序排序的整数数组 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 /**
2  * @param {number[]} nums
3  * @return {number[]}
4  */
5 var sortedSquares = function(nums) {
6    return nums.map(x=>x*x).sort((a,b)=>a-b); 
7 };

方法二:直接排序/暴力排序

时间复杂度:O(nlogn),其中 n 是数组nums 的长度。

空间复杂度:O(logn)

 1 /**
 2  * @param {number[]} nums
 3  * @return {number[]}
 4  */
 5 var sortedSquares = function(nums) {
 6 for(let i = 0; i<nums.length;i++){
 7     nums[i] = nums[i]*nums[i];
 8 }
 9 nums.sort((a,b)=>a-b);
10 return nums;
11 };

方法三:双指针

时间复杂度:O(n)

空间复杂度:O(1)

思路:平方后,有可能出现最大的数在两边。定义双指针分别指向nums的头和尾,比较头和尾的绝对值大小。如果头大,头进入res(指进入到res的尾部),左指针右移。

 1 /**
 2  * @param {number[]} nums
 3  * @return {number[]}
 4  */
 5 var sortedSquares = function(nums) {
 6 let res = [];
 7 for(let i =0, j=nums.length-1;i<=j;){
 8     const left = Math.abs(nums[i]);
 9     const right = Math.abs(nums[j]);
10     if(right>left){
11         res.unshift(right*right);
12         j--;
13     }else{
14         res.unshift(left*left);
15         i++;
16     }
17 }
18 return res;
19 };
posted @ 2021-08-09 15:25  icyyyy  阅读(89)  评论(0)    收藏  举报