1.1 题目:
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
1.2 实例:
示例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.3 提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
已按 非递减顺序 排序
2.解题思路
可以使用暴力解法,先使用for循环把数组每个元素平方然后在使用for循环进行排序。这里采用双指针方法,利用了两个指针 l
和 r
,分别从数组的两端向中间遍历,根据元素平方值的大小来决定将哪个元素的平方值放入结果数组 res
中。最终,返回结果数组 res
,其中包含了原数组中每个元素的平方值,并保持了排序顺序。这个算法的时间复杂度为 O(n),其中 n 是数组的长度。
3.代码
class Solution {
public int[] sortedSquares(int[] nums) {
// 定义左右指针,分别指向数组的第一个和最后一个元素
int l = 0;
int r = nums.length - 1;
// 创建一个新的数组用于存储平方后的结果
int[] res = new int[nums.length];
// 定义索引 j,从结果数组的最后一个位置开始填充
int j = nums.length - 1;
// 使用双指针从两端向中间遍历原数组
while (l <= r) {
// 如果左指针对应的元素平方大于右指针对应的元素平方
if (nums[l] * nums[l] > nums[r] * nums[r]) {
// 将左指针对应的元素的平方放入结果数组中,并向右移动左指针和结果数组的索引
res[j] = nums[l] * nums[l];
l++;
j--;
} else {
// 否则,将右指针对应的元素的平方放入结果数组中,并向左移动右指针和结果数组的索
res[j] = nums[r] * nums[r];
r--;
j--;
}
}
// 返回结果数组,其中包含了原数组中每个元素的平方值,且保持了排序顺序
return res;
}
}
4.结尾
希望大家喜欢这个算法题解!如果您觉得这篇文章对您有帮助,不妨给我点个赞,这将是对我最大的鼓励。如果您有任何问题、建议或想法,请随时在评论区留言,我将竭诚为您解答。感谢您的阅读!