(非复制粘贴!)LeetCode-977有序数组平方的一些理解

文章讨论了一种处理按非递减顺序排列的数组,要求返回平方后仍保持非递减顺序的方法。通过对不同情况的分析,得出最大值总是在数组的边界。采用双指针策略,从两端开始比较并填充新数组,确保了排序的正确性。提供的Java代码示例展示了如何实现这一算法。
摘要由CSDN通过智能技术生成

在题目中给出一个按非递减顺序排列的数组,要求返回一个也是非递减顺序的数字平方的数组。

所以我的第一反应就是先平方再排序,平方后的数组一共有以下三种情况:

1.递减

eg:原数组[-4, -3, -2, -1, 0] 

平方后:[16, 9, 4, 1, 0]

2.递增

eg:原数组[0, 1, 2, 3, 4]

平方后:[0, 1, 4, 9, 16]

3.先递减再递增

eg:原数组[-4, -1, 0, 3, 10]

平方后:[16, 1, 0, 9, 100]

注意平方后的所有情况,我们可以发现最大值在数组的最左或最右;在去掉最大值后,次大值也是在数组的最左或最右;去掉次大值后,次次大值也是在数组的最左或最右……

得到这个规律后我们可以使用双指针(当作比较区间!),一个指针在数组最左端,另一个在数组最右边。将指针位置上的数值比较,大的一方放在新数组的最右端并更新这个指针的指向(+1或-1)。当左边的指针位置大于右边的指针位置时说明比较完成。

代码如下:

class Solution {
        public int[] sortedSquares(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        int[] new_nums = new int[nums.length];
        //写入的顺序是从大到小
        int write = nums.length - 1;
        //平方
        for(int i =0; i <nums.length; i++){
            nums[i] = nums[i] * nums[i];
        }
        // 左指针大于右指针位置后不再比较
        while (left <= right){
            //左指针位置上的数大 将该数放在新数组中没更新过的最右位置(即从大到小写入)
            if (nums[left] > nums[right]){
                new_nums[write] = nums[left];
                // 左指针右移
                left ++;
                // 更新 新数组待写入的位置
                write --;
            }
            else {
                //右指针上的数大
                new_nums[write] = nums[right];
                right --;
                write --;
            }
        }
        return new_nums;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值