977. 有序数组的平方
描述
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
分析
若直接对数组每个元素取平方,可能会出现一种情况,负数取平方会大于某些正数。 如图:可能会出现这样的分布情况。
提问:此时怎么使得数组有序?
- 排序 ,时间复杂度为O(nlogn),空间复杂度O(1)
- 双指针。如上图出现的情况分为左右有序,题目要求整体有序。此时使用双指针法各自指向数组的一端并比较,把较大元素加入到新数组,循环执行。(注:合并两个有序数组或链表的题目都使用该方法)
解法(使用双指针法)
- 先将数组所有元素取平方
- 使用首尾指针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;
}
总结
使用双指针的目的在于,比较首尾元素,选取更大的元素加入到新数组,从而形成数组的有序。