给你一个按非递减顺序 排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
解题思路:
双指针:
left 指针指向 nums 数组的开头;
right 指针指向 nums 数组的结尾。
因为 nums 数组在平方前是有序的,并且 nums 数组的平方的最大值一定是在两端找到的,不可能出现在中间位置。
所以,利用 left 指针和 right 指针每次找到 nums 数组两端中绝对值较大的那个元素,将其平方后,
存入一个新的数组中。
代码:
class Solution {
public int[] sortedSquares(int[] nums) {
int[] ans = new int[nums.length]; // 保存最后的结果
int left = 0; // left 指针指向 nums 数组的开头
int right = nums.length - 1; // right 指针指向 nums 数组的结尾
int index = nums.length - 1; // index为新数组的索引
while(left <= right) {
if(nums[left] * nums[left] <= nums[right] * nums[right]) {
// 右侧大于左侧
ans[index--] = nums[right] * nums[right];
right--;
}else {
// 左侧大于右侧
ans[index--] = nums[left] * nums[left];
left++;
}
}
return ans;
}
}
时间复杂度:O(N),只遍历了一次数组
空间复杂度:O(1),除了最终的目标数组,没有申请其他空间
这篇博客介绍了如何运用双指针法解决一个编程题目:给定一个非递减排序的整数数组,返回每个数字平方后的非递减排序数组。解题过程中,通过左右指针分别从数组两端开始,比较并选取平方值较大的元素加入结果数组,从而实现排序。这种方法的时间复杂度为O(N),空间复杂度为O(1)。
322

被折叠的 条评论
为什么被折叠?



