PAT A1001 Quick Sort

思路:与A1093相似,针对每个数统计其左边的最大值以及右边的最小值。如果满足当前数大于左边最大值且小于右边最小值,则满足条件。

最大值用数组统计,最小值只设变量rightMin,在统计rightMin的循环中统计满足要求的下标进而得出答案。

相似题目:PAT A1093 CountPATs

#include<cstdio>
#define MAXN 100005

int nums[MAXN];
int leftMAX[MAXN];
int ans[MAXN];

int main() {
    int n;
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        scanf("%d", &nums[i]);
    }
    leftMAX[0] = nums[0];
    for(int i = 1; i < n; i++) {
        leftMAX[i] = leftMAX[i-1];
        if(nums[i] > leftMAX[i]) {
            leftMAX[i] = nums[i];
        }
    }
    int count = 0;
    int rightMin = nums[n-1];
    for(int i = n-1; i >= 0; i--) {
        if(nums[i] <= rightMin) {
            rightMin = nums[i];
            if(nums[i] >= leftMAX[i]) {
                ans[count++] = i;
            }
        }
    }
    printf("%d\n", count);
    for(int i = count-1; i >= 0; i--) {
        printf("%d", nums[ans[i]]);
        if(i > 0) printf(" ");
    }
    printf("\n");
    return 0;
}