![](https://i-blog.csdnimg.cn/blog_migrate/7fe1e2fd7ed95f383881c32334108c6d.png)
思路与LeetCode88题一样,只是稍微进行点修改
因为数组是有序的,只要把负数单独摘出,平方后逆序插入新数组就可以解决问题。
1 2 3 0 0 0
2 5 6
由于数组已经是排好顺序的,最末尾的元素必定时最大的,我们只要对最末尾的元素进行比较,将最末尾的元素放到最尾端,然后不断进行比较即可,而这里我们需要用到
3个指针。一个指针指向nums1数组的最后一个值,一个指向nums1的nums1[m-1]值,一个指向nums2[n-1]。
![](https://i-blog.csdnimg.cn/blog_migrate/343dfea6540f70c3c3bbaa9def4d2484.png)
![](https://i-blog.csdnimg.cn/blog_migrate/618a569a9fa4c97e3b0e9bd52942b63a.png)
指针索引注意细节:
当橙色指针的索引小于
0时,数组已经排好顺序了。同时本题一定要把负数单独摘出来
public int
[] sortedSquares(
int
[] A) {
int
len=A.
length
;
int
i=
0
;
while
(i<len&&A[i]<
0
){
++i;
}
int
j=i;
int
[]nums1=
new int
[len];
for
(
int
k=i-
1
;k>=
0
;k--){
nums1[i-
1
-k]=A[k]*A[k];
}
int
[]nums2=
new int
[len-j];
for
(
int
z=
0
;z<nums2.
length
;z++){
nums2[z]=A[j]*A[j];
j++;
}
int
i1=i-
1
;
int
i2=nums2.
length
-
1
;
int
cur=nums1.
length
-
1
;
//
不用观察
i1
是否小于等于
0
,因为当
i1
小于等于
0
时,
i2
仍然继续执行
//i2
小于
0
时,
i1
已经拍好顺序了
while
(i2>=
0
){
if
(i1>=
0
&&nums1[i1]>=nums2[i2]){
nums1[cur--]=nums1[i1--];
}
else
{
// i1 < 0 || nums2[i2] >= nums1[i1]
nums1[cur--]=nums2[i2--];
}
}
return
nums1;
}
|