基本算法思想
实际上对于一个简单的有序数组的平方排序,我们第一印象肯定是暴力搜索,不论是自己写快排,还是调用STL当中的sort方法都是一个方法,这边也给出相关的算法实现。
//下面的实现过程也是最容易想到的,先计算后排序。
//时间复杂度也不高,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;
}
};
但这边也稍微介绍一下双指针法,进行处理这一部分的题目
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;) { // 注意这里要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;
}
};
时间复杂度由原本的O(nlogn)变成了O(n)实际上还是减少了挺多的,还是可以变换一下,不过关于代码的书写方式,也可以和下面leetcode 方式进行综合,形成自己习惯的书写方式。
leetcode 977 有序数组的平方
实际上就需要理解一下上面的那些代码讲解。此题自然水到渠成。
AC-code
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
//分析题目,得到返回的是一个新的vector,且对于空间复杂度没有明确的要求,故采用新建一个vector进行方便的存储
vector<int >current_nums(nums.size());
int left_index = 0, right_index = nums.size() - 1;
int all_size_tag = nums.size() - 1;
int left = 0, right = 0;
//好好理解一下这一些变量定义的原因,分别表示的是什么
//下面判断的过程还是非常基础的双指针法。
while (left_index <= right_index)
{
left = nums[left_index] * nums[left_index];
right = nums[right_index] * nums[right_index];
if (left > right)
{
current_nums[all_size_tag--] = left;
left_index++;
}
else
{
current_nums[all_size_tag--] = right;
right_index--;
}
}
return current_nums;
}
};