力扣:有序数组平方

题目描述

在这里插入图片描述

解题

class Solution {
    public int[] sortedSquares(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        int[] result = new int[nums.length];
        int k = nums.length - 1;
        while(left <= right){
            if(nums[left] * nums[left] < nums[right] * nums[right]){
                result[k--] = nums[right] * nums[right];
                right--;
            }else{
                result[k--] = nums[left] * nums[left];
                left++;
            }
        }
        return result;
    }
}

思路

首先明确一下题目要求,给的数组是一个非递减顺序排序,那么就是说明会有负数,当有负数之后就会有两种情况:
可能负数的平方会比正数的平方大,那么这个最大值就是在负数这边且是负数的最小值。
还有一种情况就是正数的平方比负数大,那么最大值就是在正数里面的最大值。

这时我们就可以发现,最大值要不就是在有负数的最左边或者正数的最右边。
那么我们就只需要将两边的数据进行比较然后较大的就是最大值然后倒序填入到新数组中。

整个大小趋势就如图所示:
在这里插入图片描述
所以这时我们就可以选择使用双指针,然后分别从左右两边遍历,选择出里面较大的一个来填入到一个新数组中,这个新数组要倒叙插入,因为从两边遍历是从最大值开始遍历。而新数组的要求也是非递减的,那么只能倒叙插入保证从大到小非递减的顺序。

注意

这里面代码也有一个临界值的问题:就是这个 while 循环的条件。
这个也可以采取一个举例的方式来进行检查,例如如果是left < right 那么当最后还剩 [3, 4] 的时候,又进行了一次比较,这时 4 被加入到了新数组中。然后还剩一个 3 这时left = right了不符合条件就直接跳出来,这样就少处理了一个元素。所以应该是left <= rigth

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值