双指针-有序数组的平方

48 阅读1分钟

977. 有序数组的平方

描述

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

分析

若直接对数组每个元素取平方,可能会出现一种情况,负数取平方会大于某些正数。 如图:可能会出现这样的分布情况。

image.png

提问:此时怎么使得数组有序?

  1. 排序 ,时间复杂度为O(nlogn),空间复杂度O(1)
  2. 双指针。如上图出现的情况分为左右有序,题目要求整体有序。此时使用双指针法各自指向数组的一端并比较,把较大元素加入到新数组,循环执行。(注:合并两个有序数组或链表的题目都使用该方法)

解法(使用双指针法)

  • 先将数组所有元素取平方
  • 使用首尾指针slow和fast,分别指向数组的首部和尾部。
  • 开辟新数组a。分别比较首尾元素。若 nums[fast]>=nums[slow] , fast--,并将该元素加入新数组尾部;若nums[fast]<nums[slow],slow++,并将该元素加入新数组

时间复杂度O(n) ,空间复杂度O(n)

代码

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

        int[] a=new int[nums.length];
        int slow=0;
        int fast=nums.length-1;

        int index=nums.length-1;
        while(index>=0){
            a[index--]=nums[fast]>=nums[slow]?nums[fast--]:nums[slow++];
        }
        return a;
    }

总结

使用双指针的目的在于,比较首尾元素,选取更大的元素加入到新数组,从而形成数组的有序。