题目
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
暴力解法
将数组每个数平方后排序
public int[] sortedSquares(int[] nums) {
for(int i=0;i<nums.length;i++){
nums[i]=nums[i]*nums[i];
}
int t;
for(int i=0;i<nums.length-1;i++)
for(int j=i+1;j<nums.length;j++)
{
if(nums[i]>nums[j])
{
t=nums[i];
nums[i]=nums[j];
nums[j]=t;
}
}
return nums;
}
这个解法还可以将后面的排序语句用Arrays.sort()代替
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 a,b,negative=-1;
for (int i = 0; i < n; ++i) {
if (nums[i] < 0) {
negative = i;
} else {
break;
}
}
b=negative+1;//第一个非负数
a=negative;//第一个负数
int[] ans = new int[n];
int j=0;
while(j<n)
{
if(a<0)
{
ans[j]=nums[b]*nums[b];
j++;
b++;
}
else if(b>n-1)
{
ans[j]=nums[a]*nums[a];
j++;
a--;
}
else if(nums[a]*nums[a]>nums[b]*nums[b])
{
ans[j]=nums[b]*nums[b];
j++;
b++;
}
else
{
ans[j]=nums[a]*nums[a];
j++;
a--;
}
}
return ans;
}