1.题目描述
2.解题思路
2.1理解题意
2.2解决方法
2.3完整代码
3.小节
1.题目描述:
给你一个按非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
2.解题思路:
2.1理解题意:
从题目中我们知道该数组为非递减数组,我们需要判断数组中所有元素平方后的值大小,再按照从小到大的顺序排列;
该数组为非递减数组,所以数组中的元素平方后的值的大小是按照两边大中间小的规律存在的,且数组中所有元素平方后只是值发生了变化,但是数组中元素的个数还是不变,数组长度还是和原来一样
2.2解决方法:
1.定义两个指针,left和right
left为数组最左侧的边界(也是起始索引):一般开始为0
right为数组最右侧的边界(末端索引):一般由数组长度(nums.length)决定right = nums.length - 1
2.创建一个新数组,新数组的长度为nums.lengthl-1
3.当数组中right位置所对应的值的平方大于left位置所对应的值的平法,将该位置放入新数组中,因为获取的值是需要按照从大到小的顺序排列的,所以每当有一个数被放到新数组中,新数组的索引就需要进行减一操作,初始索引为nums.length-1,然后我们需要将right进行减一操作,继续进行上述循环;
4.当数组中left位置所对应的值的平方大于等于right位置所对应的值的平法,将该位置放入新数组中,因为获取的值是按照从大到小的顺序排列的,所以每当有一个数被放到新数组中,新数组的索引就需要进行减一操作,初始索引为nums.length-1,然后我们需要将left进行加一操作,继续进行上述循环;
5.返回新数组
2.3完整代码:
class Solution {
public int[] sortedSquares(int[] nums) {
int left = 0;
int right = nums.length-1;
int[] result = new int[nums.length];
int index = nums.length-1;
while(left<=right){
if(nums[right]*nums[right]>nums[left]*nums[left]){
result[index--]=nums[right]*nums[right];
right--;
}else{
result[index--]=nums[left]*nums[left];
left++;
}
}
return result;
}
}
3.小节:
著此篇,与君享,互勉之,共进步!