前言
题目: 977.有序数组的平方
文档: 代码随想录------有序数组的平方
编程语言: C++
解题状态: 完成,暴力解题
思路
最简单的思路就是平方以后排序,其中平方的过程的时间复杂度为 O ( n ) O(n) O(n),整体的时间复杂度基本上取决于排序的时间复杂度。
其次还可以考虑双指针法。
代码
方法一: 暴力排序
这里我使用的排序法为时间复杂度 O ( n 2 ) O(n^2) O(n2)的选择排序法。
- 时间复杂度: O ( n 2 ) O(n^2) O(n2)
- 空间复杂度: O ( 1 ) O(1) O(1)
cpp
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for (int i = 0; i < nums.size(); i++) {
nums[i] = nums[i] * nums[i];
}
// 选择排序
for (int i = 0; i < nums.size(); i++) {
int minIndex = i;
for (int j = i; j < nums.size(); j++) {
if (nums[j] < nums[minIndex]) minIndex = j;
}
swap(nums[i], nums[minIndex]);
}
return nums;
}
};
方法二: 双指针法
数组其实是有序的, 只不过负数平方之后可能成为最大数了。
那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( 1 ) O(1) O(1)
cpp
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k = nums.size() - 1;
vector<int> result(nums.size(), 0);
for (int i = 0, j = nums.size() - 1; i <= j;) {
if (nums[i] * nums[i] > nums[j] * nums[j]) {
result[k--] = nums[i] * nums[i];
i++;
} else {
result[k--] = nums[j] * nums[j];
j--;
}
}
return result;
}
};