有序数组的平方
给你一个按非递减顺序排序的整数数组 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 };

浙公网安备 33010602011771号