/**
* 给你一个按 非递减顺序 排序的整数数组 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.双指针p0 = 0,p1= nums.length-1,当p0<=p1时,每次都将大者加入结果数组result中。 时间复杂度为 O(n)
*
* 解题思路二:
* 1.双指针
* 由于数组nums已经按照升序排序,那么一定有一个分界值dividing,使得[1,dividing]均为负数,[dividing+1,nums.length] 均为正数
* 我们就可以用p1值为dividing,p2值为dividing+1的2个指针分别背向移动去进行比较
* 利用nums已经排好序的特性:
* 当p1<0之后 直接将p2右剩余数据放入数组就行了
* 同理 p2==n 之后 直接将p1左剩余数据放入数组就行了
*/
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortedSquares1 = function(nums) {
var p0 = 0,p1= nums.length-1,result=[],index = nums.length-1;
for(var i=0;i<=p1;i++){
while(p0<=p1){
if(nums[p0]*nums[p0]>nums[p1]*nums[p1]){
result[index]=nums[p0]*nums[p0];
p0++;
}else{
result[index]=nums[p1]*nums[p1];
p1--;
}
index--;
}
}
return result;
};
var sortedSquares = function(nums) {
var n= nums.length,dividing = -1;
for(var i=0;i<n;i++){
if(nums[i]<0){
dividing = i;
}else{
break;
}
}
var p1= dividing,p2=dividing+1,result=[],index=0;
while(p1>=0||p2<n){
if(nums[p1]*nums[p1]>=nums[p2]*nums[p2]){
result[index] = nums[p2]*nums[p2];
p2++;
}else if(p1<0){
result[index] = nums[p2]*nums[p2];
p2++;
}else if(p2==n){
result[index] = nums[p1]*nums[p1];
p1--;
}else{
result[index] = nums[p1]*nums[p1];
p1--;
}
index++;
}
return result;
};
var nums = [-4,-1,0,3,10];
console.log(sortedSquares(nums));
leetcode算法刷题记录之有序数组的平方
最新推荐文章于 2022-08-21 12:56:09 发布