代码随想录Day2 | 有序数组的平方 - Java

题目

给你一个按非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序

示例

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

思路

这里其实还是用到了双指针的方法。我们可以先想一想,对于经过非递减顺序排序的整数数组,平方的最大值会出现在哪里呢?实际上,平方的最大值只会出现在整数组的两端。想要一个数的平方最大,我们只需要保证一个数的绝对值是最大的,因此绝对值最大的数只会出现在整数组的两端(通俗点讲,要么是最正的数,要么是最负的数)。这也就引出了双指针的做法。

我们可以定义两个指针leftPointer和rightPointer,分别指向数组的最左端和最右端。我们每次比较两个指针指向的数的平方的大小,并将其放在新数组空缺部分的最末尾,因为我们每次提取出来的数一定是剩余数组中的最大值。之后,我们将指向平方最大的那个数的指针往相对的方向移动一格(leftPointer向右移,rightPointer向左移),继续上面比较、填充的操作即可。

代码实现

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

这里的终止条件就是leftPointer > rightPointer,说明数组中的所有数都已经遍历过一遍了。

代码中的currentIndex就是代表了新数组每次填入新数时候的位置,也就是新数组空缺位置的最末端。

希望这篇博客对你们能有帮助!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值