403 字
2 分钟
977. 有序数组的平方
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:直接对每个元素平方,最后排序。时间复杂度等于快速排序的复杂度。
- 思路2:创建一个数组,将每个元素按顺序地填充到对应的位置,类似于直接插入排序。
- 思路3:由于存在正负号,数组中的绝对值呈现两端大,中间小的情况。
- 思路2的问题就是,以绝对值最小值为分界点,按照从前往后的顺序,前半部分从大到小,而后半部分从小到大。
- 为了避免这种情况,可以使用2个指针从两端开始遍历比较,这样就可以避免顺序不一致的情况。
- 另外,两端的数据大,因此要添加到结果数组中的最后面。
代码流程
- 创建双指针
left, right
- 创建一个结果数组和末尾指针
res, i
- 从后往前添加结果到
res
中 - 比较
nums[left], nums[right]
,添加大的,并更新指针。
代码
class Solution {public: vector<int> sortedSquares(vector<int>& nums) { int n = nums.size(); vector<int> res(n); int left = 0; int right = n - 1; for(int i = n-1; i >= 0; i--){ if(abs(nums[left]) > abs(nums[right])){ res[i] = nums[left] * nums[left]; left++; } else{ res[i] = nums[right] * nums[right]; right--; } } return res; }};