思路:主元的特征是大于左侧元素,小于右侧元素。
方法一,需三次遍历。从左到右遍历一次,得到各位置左侧最大数的数组,再从右到左遍历得到各位置右侧最小数的数组。最后遍历判断是否是主元。
方法二,需一次遍历。先把序列sort得到各元素在有序序列中的最终位置,再从左到右遍历,若该元素在最终位置,且大于其左侧所有元素,那么他就可以是主元。代码如下:
#include <cstdio>
#include <algorithm>
int main(){
int N;
scanf("%d", &N);
int nums[N], backup[N];
for(int i=0; i<N; i++){
scanf("%d", &nums[i]);
backup[i] = nums[i];
}
std::sort(backup, backup+N);
int ans[N];
int ans_len=0;
int left_max = -1;
for(int i=0; i<N; i++){
if(nums[i]==backup[i] && nums[i]>left_max){
ans[ans_len++] = nums[i];
}
left_max = std::max(left_max, nums[i]);
}
std::sort(ans, ans+ans_len);
printf("%d\n", ans_len);
if(ans_len==0) printf("\n");
else{
for(int i=0; i<ans_len; i++){
printf("%d", ans[i]);
if(i<ans_len-1) printf(" ");
}
}
return 0;
}