文章目录
- 3.有序数组的平方
- 3.1题目
- 3.2思路
- 3.2.1暴力解法
- 3.2.2双指针法
3.有序数组的平方
3.1题目
977.有序数组的平方——力扣题目链接
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
- 示例一:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
- 示例二:
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]
3.2思路
3.2.1暴力解法
- 遍历数组,将数组的每个元素平方,接着排个序即可
3.2.2双指针法
-
原数组是==有序==的,就是说数字0的左区间(平方后的元素,越左边,越大)、右区间(平方后的元素,越右边,越大)
-
由此可以得出平方后的数组最大值不是在原数组最左边,就是最右边
-
考虑双指针法了,i指向起始位置,j指向终止位置
-
示意图:
class Solution {
public int[] sortedSquares(int[] nums) {
//思路:原数组有序,那最大值不是在最左边,就是在最右边
//双指针:分别指向最左边和最右边,并新建一个数组,将最大值移向数组的最后面
int len=nums.length;
int j=nums.length-1;
int k=nums.length-1;
int[] arr=new int[len];
for(int i=0;i<=j;i++){ //循环条件 i<=j,最后要处理最后一个元素
if(nums[i]*nums[i]>nums[j]*nums[j]){
// i位置的元素的绝对值大
arr[k--]=nums[i]*nums[i];
}else{
// j位置的元素的绝对值大
arr[k--]=nums[j]*nums[j];
i--; //i保持不动
j--;
}
}
return arr;
}
}