方法一:暴力解法(先平方,后排序)时间复杂度O(N^2)
class Solution {
public int[] sortedSquares(int[] nums) {
for(int i=0;i<nums.length;i++){
nums[i] = nums[i] * nums[i];
}
Arrays.sort(nums);
return nums;
}
}
方法二:双指针(从两边向中间靠近)
class Solution {
/**本解法最核心的思想:
因为原数组是有序数组,所以平方之后最大的结果一定是头元素和尾元素中的一个
*/
public int[] sortedSquares(int[] nums) {
//创建一个新数组来存放平方之后的结果(空间换时间?)
int[] result = new int [nums.length];
//k作为尾指针,找到最大的平方结果放在新数组尾部,K向左移动
int k = result.length -1;
//
//i和j作为原数组的头指针和尾指针
for(int i=0,j=nums.length-1;i<=j;){
// 比较头元素和尾元素平方之后的结果,把大的放入result数组的尾部,之后移动指针
if(nums[i]*nums[i] > nums[j]*nums[j]){
result[k--] = nums[i]*nums[i];
i++;
}else{
result[k--] = nums[j]* nums[j];
j--;
}
}
return result;
}
}