文章目录
题目
给你一个按 非递减顺序 排序的整数数组 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]
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums 已按 非递减顺序 排序
进阶:
请你设计时间复杂度为 O(n) 的算法解决本问题
思路
首先明白一个点,非递减顺序,也就是非单调递增,中间可以有重复,例如,5,6,6,7这种,较好考虑的一个思路是暴力解决,将数组每个数平方后赋给原来的数组,在对数组排序,但这样由于排序时间复杂度不为O(n),外加由于有负数,平方后不一定小,所以用考虑用双指针法,双指针在数组中的应用很广泛。用l表示数组最左边下标,用r表示最右边下标,在重新定义一个长度与nums一致的数组,用k指向最右边,通过nums[r]*nums[r]与nums[l]*nums[l]比较,谁大就赋值给nums[k]并且向前或向后移动,直至l>r结束
双指针(java)
class Solution {
public int[] sortedSquares(int[] nums) {
int r = nums.length - 1;
int l = 0;
int[] t = new int[nums.length];
int k = t.length - 1;
while(l<=r){
if(nums[l]*nums[l]<nums[r]*nums[r]){
t[k--] = nums[r]*nums[r];
r--;
}
else{
t[k--] = nums[l]*nums[l];
l++;
}
}
return t;
}
}