力扣977. 有序数组的平方
作者:互联网
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array
解法一:
public int[] sortedSquares(int[] nums) {
for (int i = 0; i < nums.length; i++) {
nums[i]=nums[i]*nums[i];
}
Arrays.sort(nums);
return nums;
}
本题比较简单,但是使用简单解法耗时较高。
对每个数平方后放回原位,然后对数组排序。
解法二:双指针法
public int[] sortedSquares(int[] nums) {
int n=nums.length;
int negative=-1;
for (int i = 0; i < n; i++) {
if(nums[i]<0){
negative=i;
}else {
break;
}
}
int[] ans=new int[n];
int index=0,i=negative,j=negative+1;
while(i>=0||j<n){
if(i<0){//只有正的存在,正序填充即可
ans[index]=nums[j]*nums[j];
++j;
}else if(j==n){//全是负的,逆序填充
ans[index]=nums[i]*nums[i];
i--;
}else if(nums[i] * nums[i] < nums[j] * nums[j]){//较小者填充
ans[index]=nums[i]*nums[i];
i--;
}else{//较小者填充
ans[index]=nums[j]*nums[j];
++j;
}
index++;
}
return ans;
}
相当于定义两个指针,首先将数组分成两部分,由于他是已经排好序的(这点很重要),负数部分从后往前递增,正数部分从前往后递增,算法定位到最后一个负数的位置作为指针1,然后此位置加一(第一个正数位置)作为指针二,边界条件是i>=0||j<n ,如果两个条件都不满足,说明已经处理完毕。
标签:977,index,平方,nums,int,力扣,++,数组,ans 来源: https://blog.csdn.net/m0_56033865/article/details/121962030