有序数组的平方链接
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]
这个题我上来就是每个都平方之后然后排序,哈哈哈,也就是下面这种傻蛋写法,都想到双指针了,结果双指针却用来计算平方了。
class Solution {
public int[] sortedSquares(int[] nums) {
int slow=0;
for(int fast=0;fast<nums.length;fast++)
{
nums[slow]=nums[fast]*nums[fast];
slow++;
}
Arrays.sort(nums);
return nums;
}
}
双指针法
数组其实是有序的, 只不过负数平方之后可能成为最大数了。
那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
此时可以考虑双指针法了,l指向起始位置,r指向终止位置。
定义一个新数组arr,和nums数组一样的大小,利用temp的向后移动的操作来对新数组赋值
class Solution {
public int[] sortedSquares(int[] nums) {
int len=nums.length;
int[]arr=new int [len];
int r=len-1;
int temp=arr.length-1;
int l=0;
while(l<=r)
{
if(nums[l]*nums[l]>nums[r]*nums[r])
{
arr[temp--]=nums[l]*nums[l];
l++;
}
else {
arr[temp--]=nums[r]*nums[r];
r--;
}
}
return arr;
}
}