算法记录 Day 2
977.有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
题目链接: 有序数组的平方.
解题思路:
1.双指针法
class Solution {
public int[] sortedSquares(int[] nums) {
int numsize = nums.length;
int[] result = new int[numsize];
int left = 0;
int right = numsize - 1;
int k = numsize -1;
while(left <= right){
if ( nums[left] * nums[left] > nums[right] * nums[right]){
result[k] = nums[left] * nums[left];
k--;
left++;
}
else{
result[k] = nums[right] * nums[right];
k--;
right--;
}
}
return result;
}
}
难点
1. 怎么用双指针?
因为数组是非递减顺序的,所以平方最大的数一定在数组的两边(可能有负数的存在),所以我们用左右两个指针,依次比较,把较大的数放在一个新的数组的最后。
这里要注意不能从前往后 往新数组里放数,因为较小的数如果放在第一个位置,left指针加1,后面的数的平方是完全有可能比第一个数的平方小的,比如 [-4,-1,0,3,10] 。
总结
时间复杂度O(N)