977.有序数组的平方

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;
}

在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值