2024.1.25【数组】3.有序数组的平方
解法1:暴力排序
思路:遍历数组 将每个数平方之后,采用 快速排序 进行排序。
时间复杂度: O(n + nlogn)
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
for (int i = 0; i < A.size(); i++) {
A[i] *= A[i];
}
sort(A.begin(), A.end()); // 快速排序
return A;
}
};
解法2:双指针法
时间复杂度:O(n)
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
int k = A.size() - 1;//记录数组下标,从大到小
vector<int> result(A.size(), 0);
for (int i = 0, j = A.size() - 1; i <= j; ) {
// 【注意1】要i <= j,因为最后要处理两个元素
// 【注意2】不写“i++,j--”,是因为只有在判断出大小后,i或j才有一个的值发生改变,而不是每次判断大小后,i和j都的值都改变。
if (A[i] * A[i] < A[j] * A[j]) {
result[k--] = A[j] * A[j];
j--;
}
else {
result[k--] = A[i] * A[i];
i++;
}
}
return result;
}
};
错误存档:
//解答错误,双指针
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> result(nums.size(),0);
int a=0;
for(int p=nums.size() / 2, q=nums.size() + 1 ; p>=0,q<nums.size() ; a++ ){
int m=p*p;
int n=q*q;
if(m<n){
result[a]=m;
p++;
}else{
result[a]=n;
q++;
}
}
return result;
}
};