1045 快速排序 (25分)
这样是会超时的。。。因为循环了很多遍
for (i = 0; i < n; i++) {
flag = 0;
for (j = 0; j < i; j++) {
if (a[j] > a[i]) {
flag = 1;
break;
}
}
if (flag == 0) {
for (j = i + 1; j < n; j++) {
if (a[j] < a[i]) {
flag = 1;
break;
}
}
}
if (flag == 0) {
result[sum++] = a[i];
}
}
改了一下
第 2 行是空格分隔的 N 个不同的正整数,每个数不超过 10^9。
算法思想:
输入n个数,定义两个数组 leftmax, rightmin。leftmax[i]存储a[i]左边的数的最大值;rightmin[i]存储a[i]右边的数的最小值
第一个数的leftmax[0] = 0
最后一个数的rightmin[0] = 1000000000
然后再循环一遍如果 a[i] > leftmax[i] && a[i] < rightmin[i],就是主元!!
这样只需循环3遍!
#include<iostream>
#include<algorithm>
using namespace std;
#define maxsize 100100
#define INF 1000000000 //定义一个
int main() {
int n,i;
int a[maxsize],leftmax[maxsize],rightmin[maxsize],result[maxsize];
int sum = 0;
cin >> n;
for (i = 0; i < n; i++) {
cin >> a[i];
}
leftmax[0] = 0;
//左边第一个数的leftmax的是自己,题目中给出的是不同的数
for (i = 1; i <= n-1; i++) {
leftmax[i] = max(leftmax[i - 1], a[i - 1]);
}
rightmin[n - 1] = INF;
for (i = n - 2; i >= 0; i--) {
rightmin[i] = min(rightmin[i + 1], a[i + 1]);
}
for (i = 0; i < n; i++) {
if (a[i] > leftmax[i] && a[i] < rightmin[i]) {
result[sum++] = a[i];
}
}
cout << sum << endl;
sort(result, result + sum);
for (i = 0; i < sum; i++) {
cout << result[i];
if (i < sum - 1) {
cout << " ";
}
}
cout << endl; //测试点3---格式错误----醉了
return 0;
}