难度简单217收藏分享切换为英文接收动态反馈
给你一个按 非递减顺序 排序的整数数组 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]
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
已按 非递减顺序 排序
进阶:
- 请你设计时间复杂度为
O(n)
的算法解决本问题
思路:
复建第一题,挑个简单的做,O(n)主要是用空间换时间了。遍历一次找到0分界点(left_i),然后分别从前到后、从后到前遍历(O(n)),返回结果。
class Solution {
public int[] sortedSquares(int[] nums) {
int[] left = new int[nums.length];
int[] right = new int[nums.length];
int left_i = 0,right_i=0;
for(int i = 0 ; i < nums.length ; i++ ,left_i++){
if(nums[i]>0) break;
left[i] = nums[i]*nums[i];
}
//System.out.println("有序数组的中心点"+left_i);
for(int i = left_i ; i < nums.length ; i++){
right[i] = nums[i]*nums[i];
}
int[] res = new int[nums.length];
for(int i = 0 ,t1=left_i-1,t2=left_i ; i < nums.length && (t2<nums.length ||t1>=0); i++){
if(t2>=nums.length){
res[i] = left[t1];
t1 --;
continue;
}
if(t1<0){
res[i] = right[t2];
t2++;
continue;
}
if(left[t1]>=right[t2]){
res[i] = right[t2];
t2++;
}
else{
res[i] = left[t1];
t1--;
}
}
return res ;
}
}