977.有序数组的平方
1.暴力排序
这道题最直观的方法在于,将数组中的每个数平方之后,排个序
public int[] sortedSquares(int[] nums) {
int[]ans = new int[nums.length];
for(int i=0;i<nums.length;i++){
ans[i] = nums[i]*nums[i];
}
Arrays.sort(ans);
return ans;
}
2.双指针法
数组其实是有序的,只不过负数平方之后可能成为最大数了
那么数组平方的最大值其实就在数组的两端,不是最左边就是最右边,不可能是在中间。
此时可以考虑双指针法,i指向起始位置,j指向终止位置
定义一个新数组result,和A数组一样的大小
定义一个新指针k指向result数组终止位置
如果A[i]×A[i]<A[j]×A[j],那么就将A[j]放入result结果集的末尾,即k指针指向的数组索引位置,同时将k–
如图
public int[] sortedSquares(int[] nums) {
//双指针法
//定义两个指针left和right,一个指向数组的起始位置,一个指向末尾
int left = 0;
int right = nums.length-1;
//开辟一个结果集数组result
int[]result = new int[nums.length];
//定义指向result数组末尾的指针k
int k = result.length-1;
while(left<=right){
if(nums[left]*nums[left]>nums[right]*nums[right]){
//放入结果集
result[k--] = nums[left]*nums[left];
left++;
}else{
result[k--] = nums[right]*nums[right];
right--;
}
}
return result;
}