目录
一、题目
给你一个按 非递减顺序 排序的整数数组 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
已按 非递减顺序 排序
四、代码
1.解法一:直接排序
将数组内的数进行平方 -> 数组排序(冒泡)
class Solution {
public int[] sortedSquares(int[] nums) {
for(int i=0;i<nums.length;i++){
nums[i]=nums[i]*nums[i];
}
for(int i=0;i<nums.length-1;i++){
for(int j=0;j<nums.length-1-i;j++){
if(nums[j]>nums[j+1]){
int temp;
temp = nums[j];
nums[j] = nums[j+1];
nums[j+1]=temp;
}
}
}
return nums;
}
}
优化:排序可以直接使用函数 \ 重新定义新数组
Arrays.sort();
class Solution {
public int[] sortedSquares(int[] nums) {
int[] ans = new int[nums.length];
for (int i = 0; i < nums.length; ++i) {
ans[i] = nums[i] * nums[i];
}
Arrays.sort(ans);
return ans;
}
}
2.解法二:双指针
因为数组nums已经按升序排列 -> 负数平方后递减 正数平方后递增 -> 找到正负分界点
-> 左指针l指向第一个负数 右指针r指向第一个非负数 -> 另外定义一个新的空数组
-> 左右指针比较,哪个小哪个添加进新数组 -> 当一个指针没数据了,则将另一个指针的数据逐个
加入数组即可
class Solution {
public int[] sortedSquares(int[] nums) {
int l=-1,r=nums.length;
int[] ans = new int[nums.length];
int i=0;
for(i=0;i<nums.length;i++){
if(nums[i]<0){
l=i;
}
if(nums[i]>=0){
r=i;
break;
}
}
i=0;
while((l>=0&&r<nums.length)&&(l<=r)){
if((nums[l]*nums[l])<=(nums[r]*nums[r])){
ans[i++]=nums[l]*nums[l];
l--;
}else{
ans[i++]=nums[r]*nums[r];
r++;
}
}
while(l>=0){
ans[i++]=nums[l]*nums[l];
l--;
}
while(r<nums.length){
ans[i++]=nums[r]*nums[r];
r++;
}
return ans;
}
}