1045 快速排序 (25 分)

原题

https://pintia.cn/problem-sets/994805260223102976/problems/994805278589960192

思路

主元比它前面的所有数都要大,比它后面的所有数都要小。
那么只要跟它前面的最大值和后面的最小值比,随着判断主元位置的移动,最大值和最小值跟着变化。

代码

测试点1超时,可能因为嵌套了吧。如果最小值像最大值那么求,可能会好一点。(待做)

#include <iostream>
#include <algorithm>
using namespace std;

int main(){
    int n,cnt=0;
    int data[100000],result[100000];
    cin>>n;
    for(int i=0;i<n;i++) cin>>data[i];
    int max=0;
    
    for(int i=0;i<n;i++){    
        bool flag=true;
        if(data[i]>=max){
           for(int j=i+1;j<n;j++){
            if(data[i]>data[j]){
                flag=false;
                break;
            }            
         }
         if(flag) result[cnt++]=data[i];            
        }           
        if(data[i]>max) max=data[i];       
    }
    printf("%d\n",cnt);
    sort(result,result+cnt);
    for(int i=0;i<cnt;i++){
        if(i!=0) printf(" ");
        printf("%d",result[i]);
    }  
    printf("\n");//不加就一个测试点2的格式错误      
    return 0;
}

https://blog.csdn.net/shiliang97/article/details/100022295
然后这位博主和柳大佬的分析

对原序列sort排序,逐个比较,当当前元素没有变化并且它左边的所有值的最大值都比它小的时候就可以认为它一定是主元
1、因为序列是有限个的,排序后元素不管往左还是往右变化,说明左右两边至少有一边使它不满足主元的条件。
2、随着迭代的位置移动,左边最大值在变化,所以再加个大于左边最大值的条件。

#include <iostream>
#include <algorithm>
#include <vector>
int v[100000];
using namespace std;
int main() {
    int n, max = 0, cnt = 0;
    scanf("%d", &n);
    vector<int> a(n), b(n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
        b[i] = a[i];
    }
    sort(a.begin(), a.end());
    //这段代码
    for (int i = 0; i < n; i++) {
        if(a[i] == b[i] && b[i] > max)
            v[cnt++] = b[i];
        if (b[i] > max)
            max = b[i];
    }

    printf("%d\n", cnt);
    for(int i = 0; i < cnt; i++) {
        if (i != 0) printf(" ");
        printf("%d", v[i]);
    }
    printf("\n");
    return 0;
}
posted @ 2021-12-12 18:32  Infinite_V胜  阅读(20)  评论(0)    收藏  举报