给定一个按非递减顺序排序的整数数组 A
,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
示例 1:
输入:[-4,-1,0,3,10] 输出:[0,1,9,16,100]
示例 2:
输入:[-7,-3,2,3,11] 输出:[4,9,9,49,121]
提示:
1 <= A.length <= 10000
-10000 <= A[i] <= 10000
A
已按非递减顺序排序。
思路:
方法一:计算平方结果后排序
代码实现:
class Solution {
public static int[] sortedSquares(int[] A) {
for (int i=0;i<A.length;i++) //求平方
A[i] = A[i]*A[i];
for (int i=0;i<A.length-1;i++) //排序
for (int j=0;j<A.length-i-1;j++)
if (A[j]>A[j+1])
{
int temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
}
return A;
}
}
方法二:双指针,由于平方的特点,越小的负数的平方越大。所以可以维护原数组首位尾两个指针,判断指针对应元素的平方大小,将较大的一个平方数存入新数组末尾,然后指针前移,直到最终指针重合。
代码实现:
class Solution {
public static int[] sortedSquares(int[] A) {
int firstA = 0; //原数组首指针
int lastA = A.length-1; //原数组尾指针
int []res = new int[A.length]; //结果数组
int lastR = res.length-1; //结果数组尾指针
while(firstA<=lastA)
{
if (A[firstA]*A[firstA]>=A[lastA]*A[lastA])
{
res[lastR] = A[firstA]*A[firstA];
firstA++;
lastR--;
}
else
{
res[lastR] = A[lastA]*A[lastA];
lastA--;
lastR--;
}
}
return res;
}
}