力扣977. 有序数组的平方

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array

解法一:

public int[] sortedSquares(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            nums[i]=nums[i]*nums[i];
        }
        Arrays.sort(nums);
        return nums;
    }

本题比较简单,但是使用简单解法耗时较高。
对每个数平方后放回原位,然后对数组排序。

解法二:双指针法

public int[] sortedSquares(int[] nums) {
       int n=nums.length;
       int negative=-1;
        for (int i = 0; i < n; i++) {
            if(nums[i]<0){
                negative=i;
            }else {
                break;
            }
        }
        int[] ans=new int[n];
        int index=0,i=negative,j=negative+1;
        while(i>=0||j<n){
            if(i<0){//只有正的存在,正序填充即可
                ans[index]=nums[j]*nums[j];
                ++j;
            }else if(j==n){//全是负的,逆序填充
                ans[index]=nums[i]*nums[i];
                i--;
            }else if(nums[i] * nums[i] < nums[j] * nums[j]){//较小者填充
                ans[index]=nums[i]*nums[i];
                i--;
            }else{//较小者填充
                ans[index]=nums[j]*nums[j];
                ++j;
            }
            index++;
        }
        return ans;
    }

相当于定义两个指针,首先将数组分成两部分,由于他是已经排好序的(这点很重要),负数部分从后往前递增,正数部分从前往后递增,算法定位到最后一个负数的位置作为指针1,然后此位置加一(第一个正数位置)作为指针二,边界条件是i>=0||j<n ,如果两个条件都不满足,说明已经处理完毕。

上一篇:leetcode 977. 有序数组的平方


下一篇:LeetCode 977-有序数组的平方