977.有序数组的平方——学习笔记
题目:给你一个按非递减顺序排序的整数数组 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 <= 104
- -104 <= nums[i] <= 104
- nums 已按 非递减顺序 排序
题目来源:力扣(LeetCode)链接
题解:
class Solution {
public int[] sortedSquares(int[] nums) {
int len = nums.length; //记录数组的长度
int negative = -1; //存放数组的最后一个负数的下标
//遍历数组找到最后一个负数,把下标赋给nagetive
for (int i = 0; i < len; i++) {
if (nums[i] < 0) {
negative = i;
} else {
break;
}
}
int resArr[] = new int[len];//定义一个新数组,用来存放结果
int index = 0;//定义index为resArr数组的下标
int left = negative;//把数组分为负数和非负数两部分
int right = negative + 1;
while (left >= 0 || right <len) {
if (left < 0) {//说明数组中没有负数或者比较完之后只有右边还有值
resArr[index] = nums[right] * nums[right];
right++;
} else if (right == len) {//说明数组中没有非负数或者比较完之后只有左边还有值
resArr[index] = nums[left] * nums[left];
left--;
} else if (nums[left] * nums[left] > nums[right] * nums[right]) {//把较小的值放在resArr数组的前面
resArr[index] = nums[right] * nums[right];
right++;
} else {
resArr[index] = nums[left] * nums[left];
left--;
}
//每次循环resArr数组的下标都要后移
index++;
}
//把得到的结果返回
return resArr;
}
}

浙公网安备 33010602011771号