一个元素可能是主元当且仅当它比前面的元素都要大,比后面的元素都要小
因此可以建立一个最大数组maxNum和最小数组minNum,maxNum中存的都是从左数当前最大的数,minNum中存的是从右数
当前最小的数,当某个位置这两个数相等,则可能是主元
测试点2坑:没有主元的时候,要输出两个换行
#include <cstdio>
const int maxn = 100010;
int num[maxn], maxNum[maxn], minNum[maxn], nNum = 0;
int main(){
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++) scanf("%d", num + (nNum++));
int maxTemp = num[0], minTemp = num[nNum - 1];
for(int i = 0; i < nNum; i++){
if(num[i] > maxTemp) maxTemp = num[i];
if(num[n - 1 - i] < minTemp) minTemp = num[n - 1 -i];
maxNum[i] = maxTemp;
minNum[n - 1 - i] = minTemp;
} //排出maxNum,minNum后,原始数组就没用了,把它重新拿来装主元用
nNum = 0;
for(int i = 0; i < n; i++){
if(maxNum[i] == minNum[i]) num[nNum++] = maxNum[i];
}
printf("%d\n", nNum);
if(nNum == 0) printf("\n");
for(int i = 0; i < nNum; i++){
printf("%d", num[i]);
if(i < nNum - 1) printf(" ");
}
return 0;
}
2940

被折叠的 条评论
为什么被折叠?



