leetcode算法刷题记录之有序数组的平方

/**
 * 给你一个按 非递减顺序 排序的整数数组 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));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值