有序数组的平方
给定一个按非递减的整数数组nums,返回每个数字的平方。要求组成的新数组也按非递减顺序排序。
第一思路还是进行暴力排序
暴力解法
import java.util.Arrays;
class Solution {
public int[] sortedSquares(int[] nums) {
for (int i = 0; i < nums.length; i++) {
nums[i] *= nums[i];
}
Arrays.sort(nums); // 快速排序
return nums;
}
}
时间复杂度:
双指针解法
我们知道如果这个原数组储存的值如果都为非负数,那么其实不用进行排序,所以干扰解题的其实是数组中存在负数的情况,所以我们解决的问题就转变成负数平方后应该放在哪里了。
上回我们已经学到了双指针解法,提到这个不知道大家有没有思路呢,给个例子,大家思考一下。
大家能够清楚地看到平方后的数组特点,!两边大中间小,所以我们是不是从两边往中间走才是一个正确的路子。
那怎么知道两边的谁大谁小?别急,双指针就能很好的解决这个问题,新建一个数组,和原数组长度相同,再原数组中一个指针指向最左边,一个指针指向最右边,每次进行一次比较,放入新建数组中最后一个位置,然后相应指针滑动一下,直到左指针≤右指针的位置,排序结束。
class Solution{
public int[] sortedSquares(int[] nums) {
int left = 0;
int right = nums.length-1;
int result[] = new int[nums.length];
int index = result.length-1;
while(left<=right){
if(nums[left] * nums[left]<nums[right] * nums[right]){
result[index] = nums[right] * nums[right];
index--;
right--;
}
else{
result[index] = nums[left] * nums[left];
index--;
left++;
}
}
return result;
}
}
代码分析:
-
注意while里的条件
-
每次循环不要忘记将index和left/right进行更改
时间复杂度