977.有序数组的平方
题目链接
(双指针法)
//力扣题号977.有序数组的平方
//暴力排序法:
//总的时间复杂度严格来算是O(n+logn)
//#include<iostream>
//#include<vector>
//#include<algorithm>
//using namespace std;
//int main() {
// int n;
// cin >> n;
// vector<int> res(n);
// for (int i = 0;i < n;i++) {//这里的时间复杂度为O(n)
// cin >> res[i];
// res[i] = res[i] * res[i];
// }
// sort(res.begin(), res.end());//这里排序采用的是快速排序,时间复杂度为O(logn)
//
// for (int i = 0;i < n;i++) {
// cout << res[i]<<" ";
// }
// return 0;
//}
//双指针法:
//时间复杂度为O(n)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> res(n);
vector<int> result(n);
for (int i = 0;i < n;i++) {//这里的时间复杂度为O(n)
cin >> res[i];
}
int j = n-1;
int k = n-1;
int i = 0;
//下面while的时间复杂度为O(n)
while(k>=0) {//这里的判断条件也可以替换为i<=j,加=的原因是 由于我们需要把原数组的元素放进新数组,如果到这里i=j时,不继续循环,那么result就有一个位置没有放入元素
//举例说明:如果只有两个元素-4和5,i=0,j=1,那么第一次i<j进入循环之后,result[1]=res[j]*res[j],j所指元素更大,j--,此时i=j=0,如果跳出循环那么result[0]还未被赋值
if (res[i] * res[i] < res[j] * res[j]) {//由于res数组是有序数组,元素平方后的最大值要么在最前要么在最后,判断两者大小
result[k--] = res[j] * res[j];//大的就放在新数组的最后面
j--;//这里res数组最后面元素更大,将其放入新数组之后,尾指针就向前移动,继续判断倒数第二个元素和最前一个元素的大小。
}
else {
result[k--] = res[i] * res[i];
i++;//这里res最前面的元素更大,将其放入新数组后,头指针就向后移动,继续判断第二个元素和后面元素的大小
}
}
for (int i = 0;i < n;i++) {//这里的时间复杂度为O(n)
cout<< result[i]<<" ";
}
return 0;
}