class Solution {
//我这个思路有问题,我每次都是和前一个去比较,但是如果前一个的前一个更加小
//我是没法比较的,如果再去遍历所有的,就太麻烦了,双指针刚刚好
/*public int[] sortedSquares(int[] nums) {
int[] n = new int[nums.length];
for(int i=0;i<nums.length;i++){
if(i==0)
n[i] = (int)Math.pow(nums[i],2);
else if(n[i-1]>(int)Math.pow(nums[i],2)){
int temp = n[i-1];
n[i-1] = (int)Math.pow(nums[i],2);
n[i] = temp;
}
else if(n[i-1]<=(int)Math.pow(nums[i],2)){
n[i] = (int)Math.pow(nums[i],2);
}
}
return n;
}*/
public int[] sortedSquares(int[] nums){
int[] n = new int[nums.length];
int i = 0,j = nums.length-1;
int k;
for(k = nums.length-1;k >= 0;k--){
/*if(nums[i] == 0){
while(k>=0){
n[k] = nums[j]*nums[j];
k--;
j--;
}
return n;
}*/
//我这里就是觉得双指针的话,0是一个重要的分割点,0以后的都是升序,但是我这个想法
//也不全面,全是正数的情况也是不用比较的,所以我这个代码也挺多余
if(nums[i]*nums[i] > nums[j]*nums[j]){
n[k] = nums[i]*nums[i];
i++;
}
else if(nums[i]*nums[i] <= nums[j]*nums[j]){
n[k] = nums[j]*nums[j];
j--;
}
}
return n;
}
}
双指针,没啥难的。
为什么用双指针?因为这个是0为分割的,负数的平方可能大于正数的平方,所以用双指针来比较就行了,刚好0分成了两段数据。我是这样理解的