给你一个按 非递减顺序 排序的整数数组
nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例 2:
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]
思路分析:
方法一:直接排序 时间复杂度:
最简单的思路就是将数组中的数字平方后重新排序。
方法二:双指针法 时间复杂度:
考虑到数组是按照非递减顺序排序,法一的直接排序没有用到该条件。对数组的数据进行分析,如果数组中的所有数都是负数,那么平方过后数组任然是有序的。如果数组中所有数都是正数,那么平方过后的数组任然是有序的。不妨将数组按照正数负数进行划分,负数数组平方后任然遵循递减排序,而正数平方后任然遵循递增排序。于是我们便可以在数组的两旁各自创建一个指针 ,参考归并排序的思路对两个有序数组一一排序。
代码实现:
直接排序
class Solution {
public int[] sortedSquares(int[] nums) {
for (int i =0;i<=nums.length-1;i++){
nums[i]*=nums[i];
}
Arrays.sort(nums);
return nums;
}
}
双指针
class Solution {
public int[] sortedSquares(int[] nums) {
int left = 0,right = nums.length - 1;
int [] res = new int [nums.length];
int pos = nums.length - 1;
while (left<=right){
if (nums[left] * nums[left]>nums[right] * nums[right]){
res[pos] = nums[left] * nums[left];
left++;
pos--;
}
else {
res[pos] = nums[right] * nums[right];
right--;
pos--;
}
}
return res;
}
}
提交结果:
直接排序:
137 / 137 个通过测试用例
状态:通过
执行用时: 4 ms
内存消耗: 42.8 MB
提交时间:20 小时前
双指针:
137 / 137 个通过测试用例
状态:通过
执行用时: 1 ms
内存消耗: 43.1 MB
提交时间:11 分钟前