题目的链接在这里:https://leetcode-cn.com/problems/squares-of-a-sorted-array/
题目大意
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。一、示意图
二、解题思路
双指针
双指针
代码如下:
class Solution {
final static int n=10000;
public int[] sortedSquares(int[] nums) {
//给一个非递减数组 返回每个数组的平方 然后也按照非递减排序
//把第一个指针指向第一个正数
int start=n;
for(int i=0;i<nums.length;i++){
//找到第一个正数就终止循环
if(nums[i]>=0){
start=i;
break;
}
}
int[] result=new int[nums.length];
int index=0;
//先进行一些特殊判断
if(start==0){
//也就是全都是正数
while (index<nums.length){
result[index]=(nums[index]*nums[index]);
index++;
}
return result;
}
if(start==n){
//说明没有一个数是大于0的 那就全都是小于0 的 就需要从后往前
while (index<nums.length){
result[index]=(nums[nums.length-1-index]*nums[nums.length-1-index]);
index++;
}
return result;
}
//说明start在中间
//先初始 这里需要让star和右边第一个负数进行比较
/* result[index]=nums[start]*nums[start];
index++;*/
int left=start-1;
int right=start+1;
if(Math.abs(nums[left])>nums[start]){
//说明左边的比较大
result[index++]=nums[start]*nums[start];
}
else{
//说明负数比较小
result[index++]=nums[left]*nums[left];
//然后进行更新
left--;
right=start;
}
//就是进行判断
while (left>=0&&right<nums.length){
//就进行判断
int leftNum=nums[left]*nums[left];
int rightNum=nums[right]*nums[right];
if(leftNum>rightNum){
//那就是需要rightNum的操作
result[index++]=rightNum;
//然后right就需要右移
right++;
}else{
//说明左边比较小
result[index++]=leftNum;
//然后左边左边左移
left--;
}
}
//可能会出现其中一个条件还满足的情况
while (left>=0){
result[index++]=nums[left]*nums[left];
left--;
}
while (right<nums.length){
result[index++]=nums[right]*nums[right];
right++;
}
return result;
}
}