Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
977. 有序数组的平方 - 力扣(LeetCode) (leetcode-cn.com)
给你一个按 非递减顺序 排序的整数数组 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 <= 10^4
- -10^4 <= nums[i] <= 10^4
- nums 已按 非递减顺序 排序
进阶:
请你设计时间复杂度为 O(n) 的算法解决本问题
二、思路分析:
代码比较乱,但思路很简单:
- 先用二分法找到数组正负分界的位置(代码中的i表示从左第一个非负数,没有的话则为最后一个负数);
- 如果i==0(全是非负数),直接依次平方后放入新数组即可;
- 如果i!=0,双指针m=i-1,n=i,不越界的情况下将A[m]和A[n]中绝对值较小的平方后放入新数组。
- 一旦m和n有一个越界了,直接顺着另外一个方向平方后放入新数组即可。
三、AC 代码:
class Solution {
public int[] sortedSquares(int[] A) {
int[] arr = new int[A.length];
int i = 0, j = A.length - 1, index = 0;
if(A[i] < 0)
while(i < j){
index = (i + j) / 2;
if(A[index] < 0) i = index + 1;
else j = index;
}
if(i == 0)
for(int k = 0; k < A.length; k ++)
arr[k] = A[k] * A[k];
else{
int m = i - 1, n = i, loc = 0;
while(loc < A.length){
if(m == -1){
for(; loc < A.length; loc++)
arr[loc] = A[n] * A[n++];
break;
}else if (n == A.length){
for(; loc < A.length; loc++)
arr[loc] = A[m] * A[m--];
break;
}else if(A[m] + A[n] < 0){
arr[loc++] = A[n] * A[n++];
}else{
arr[loc++] = A[m] * A[m--];
}
}
}
return arr;
}
}