【LeetCode-数组】有序数组的平方
题目描述
给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
示例:
输入:[-4,-1,0,3,10]
输出:[0,1,9,16,100]
输入:[-7,-3,2,3,11]
输出:[4,9,9,49,121]
说明:
- 1 <= A.length <= 10000
- -10000 <= A[i] <= 10000
- A 已按非递减顺序排序。
题目链接: https://leetcode-cn.com/problems/squares-of-a-sorted-array/
思路1
将数组平方后排序。
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
if(A.empty()) return {};
vector<int> ans;
for(int i=0; i<A.size(); i++){
ans.push_back(A[i]*A[i]);
}
sort(ans.begin(), ans.end());
return ans;
}
};
- 时间复杂度:O(nlogn)
- 空间复杂度:O(n)
思路2
因为数组是有序的,所以可以用双指针来做。left 指向数组头,right 指向数组尾:
- 如果 left<=right,循环:
- 如果 nums[left]+nums[right]<0,说明 nums[left] 为负数且 nums[left]^2>nums[right]^2,此时将 nums[left] 的平方放入答案中,left++;
- 否则,说明 nums[left]^2<=nums[right]^2,将 nums[right]^2 放入答案中,right--;
代码如下:
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
if(A.empty()) return {};
vector<int> ans(A.size(), 0);
int left = 0;
int right = A.size()-1;
int k = right;
while(left<=right){
if(A[left]+A[right]<0){
ans[k--] = A[left]*A[left];
left++;
}else{
ans[k--] = A[right]*A[right];
right--;
}
}
return ans;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(n)