平方组成的新数组
题目:
给你一个按非递减顺序排序的整数数组 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
思路:每个数平方之后,排个序
- 过于简单
复杂度:
- 时间复杂度:O(n+nlogn)
- 空间复杂度:
代码:
1 | std::vector<int> test::solution(std::vector<int> &nums) |
解法2–双指针法
思路:本来就是有序的数组,由于负数平方之后可能会改变数组的顺序,所以重点关注负数
数组平方的最大值出现在数组的两端,左或者右,不可能是中间。所以可以考虑双指针法,left和right
- 定义新数组,用来存储结果,注意初始化大小,否则容易出现溢出错误
- 判断
nums[left]*nums[left]
和nums[right]*nums[right]
大小,以便赋值给result[i]
- 如果
nums[left]*nums[left] > nums[right]*nums[right]
那么result[i] = nums[left]*nums[left]
- 如果
nums[left]*nums[left] < nums[right]*nums[right]
那么result[i] = nums[right]*nums[right]
- 初始值
i = nums.size()-1
,方便从后往前填充
复杂度:
- 时间复杂度:o(n)
- 空间复杂度:
代码:
1 | std::vector<int> test::solution(std::vector<int> &nums) |