力扣-有序数组的平方

298 阅读2分钟

「这是我参与2022首次更文挑战的第40天,活动详情查看:2022首次更文挑战」。

有序数组的平方

题目描述

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

解法一 : 直接排序

思路 :
暴力解法: 最简单的方法就是将数组nums中的数平方后直接排序。 遍历数组中每个元素然后对每个元素求其平方,用数组进行排序。

代码:

class Solution {
    public int[] sortedSquares(int[] nums) {
        int length=nums.length;
        //构建存储nums数组各个元素平方和的新数组
        int[] target = new int[length];
        //遍历每个数组元素,然后求对应元素的平方和
        for (int i = 0; i < length; i++) {
            target[i] = nums[i] * nums[i];
        }
        //对新数组进行排序即可
        Arrays.sort(target);
        return target;
    }
}

解法二 : 双指针

思路 :

数组原本是有序的, 只是在平方之后就变得无序了, 归根结底就是负数平方之后可能成为最大数了, 但是数组平方 的最大值只会存在数组的两个极端, 不是最左边就是最右边.

举例 :

  1. 当数组为 [ -6,-5,4,7,10 ] , 处理后为 [16,25,36,49,100]
  2. 当数组为[1,3,4,5,6], 处理后为 [1,9,16,25,36]
  3. 当数组为[-10,-9,-5,-4,-2], 处理后为 [4,16,25,81,100]
    可以发现,无论数组的形式是什么,最大值一定是存在于数组的极端
    这样我们就能确定了平方后最大值的位置, 所以用双指针指向数组的两个极端, 必定能找到平方后的最大值, 将其放到新数组末尾, 之后不断向中间移动, 通过比较两个指针平方后的大小, 就能不断地将当前的最大值放入数组的尾部, 直到两个指针相遇为止.

代码:

class Solution {
    public int[] sortedSquares(int[] nums) {
        //这里将nums.length的值赋给length,后面就不需要在计算nums.length的值了
        int length=nums.length;
        //定义新数组target
        int[] target= new int[length];
        //用双指针指向数组的两端,从两端开始遍历,找到平方最大元素放到数组末尾。
        //通过比较两个指针平方后的大小,不断地将当前的最大值放入数组的尾部
        for (int i = 0, j = length - 1, pos = length - 1; i <= j;) {
            if (nums[i] * nums[i] > nums[j] * nums[j]) {
                target[pos] = nums[i] * nums[i];
                i++;
            } else {
                target[pos] = nums[j] * nums[j];
                j--;
            }
            pos--;
        }
        return target;
    }
}