977.有序数组的平方

力扣题目链接

首先很容易想到暴力解法,即把数组平方后再进行排序.时间复杂度主要看用什么排序算法.

由于题目中说明数组是非递减的,要把这个条件利用起来.当我们把一个非递减数组平方后,其最大值要么在最左边,要么在最右边.我们利用这个特性,很容易想到双指针思想.

双指针思想,首先创建一个和原数组大小相同的新数组.定义一个指针指向原数组最左侧,一个指针指向最右侧.通过比较两个平方后的值,挑出较大的值,将其放到新数组中(从后往前放);

代码如下:

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

你可能感兴趣的:(算法,leetcode,数据结构)