PAT (Basic Level) 1045 快速排序

题意

给定数组,问哪些数可能是快排中的主元。主元满足所有左边的数字都比他小,所有右边的数字都比他打。

思路

预处理前缀max后缀minO(n)校验即可。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int n;
	cin >> n;
	vector<int> a(n + 2), pre_max(n + 2, -1), suf_min(n + 2, INT_MAX);
	for (int i = 1; i <= n; ++i)
		cin >> a[i];
	for (int i = 1; i <= n; ++i)
		pre_max[i] = max(pre_max[i - 1], a[i]);
	for (int i = n; i >= 0; --i) 
		suf_min[i] = min(suf_min[i + 1], a[i]);
	vector<int> ans;
	for (int i = 1; i <= n; ++i) {
		if (a[i] > pre_max[i - 1] && a[i] < suf_min[i + 1])
			ans.push_back(a[i]);
	}
	sort(ans.begin(), ans.end());
	cout << ans.size() << '\n';
	for (int i = 0; i < ans.size(); ++i) {
		cout << ans[i] << (i == ans.size() - 1 ? '\n' : ' ');
	}
	if (ans.size() == 0) cout << '\n';
	return 0;
} 	

HINT

不定时更新更多题解,Basic Level 全部AC代码,详见 link ! ! !

发布了50 篇原创文章 · 获赞 15 · 访问量 2661

猜你喜欢

转载自blog.csdn.net/abcdefbrhdb/article/details/104594104