前两天课比较多,而且项目比较费时间,停了两天,今天确定蓝桥杯是4月13日举行个人赛省赛,满打满算也就45天了,时间真紧啊,感觉刷完代码随想录真有点难度,加油吧!
一、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
已按 非递减顺序 排序
进阶:
- 请你设计时间复杂度为
O(n)
的算法解决本问题
很简单的逻辑,想一下就明白了,就是把原数组中平方后的最大数放在最右边,然后第二大的放在最右边-1,一直到最小的数
因为数组有正有负,且非递减,那么平方后最大的数要么最左边的,要么最右边的,因此需要if进行判断
class Solution {
public int[] sortedSquares(int[] nums) {
int rightIndex = nums.length - 1;
int[] result = new int[nums.length];
int index = result.length - 1;
int leftIndex = 0;
while (leftIndex <= rightIndex) {
if (nums[leftIndex] * nums[leftIndex] > nums[rightIndex] * nums[rightIndex]) {
result[index--] = nums[leftIndex] * nums[leftIndex];
// 等效于
// result[index] = nums[leftIndex] * nums[leftIndex];
// index--;
++leftIndex;
// 写成leftIndex++; 也可以,此处没有影响
} else {
result[index--] = nums[rightIndex] * nums[rightIndex];
--rightIndex;
// 写成rightIndex--; 也可以,此处没有影响
}
}
return result;
}
}