PAT甲级1101 Quick Sort:[C++题解]DP、快速排序划分个数、快排
文章目錄
- 題目分析
- 題目來源
題目分析
來源:acwing
題意重述:快排的原理,給定一個序列,請判斷其中幾個數可以作為快速排序劃分步驟的分界點。
分界點充分必要條件是:左邊的數都比它小,右邊的數都比它大(題目給出所有數都不相同,所以是嚴格的大小關系)。
解題:
想判斷第i個數a[i]左邊是不是所有的數都小于它,只需要求左邊最大的數是不是比a[i]小,如果最大的數都小于a[i],那么所有的數都小于它。所以我們預處理一個數組L[N],L[i]L[N],L[i]L[N],L[i]表示a[1]a[1]a[1] ~ a[i]a[i]a[i]中最大的數
同理,像判斷a[i]右邊的數是不是都比它大,只需要看右邊的最小值是否比它大。所以預處理右邊一個數組R[N],R[i]R[N],R[i]R[N],R[i]表示a[i]a[i]a[i] ~ a[n]a[n]a[n]中最小的數。
所以我們只需要判斷L[1]L[1]L[1] ~ L[i?1]L[i-1]L[i?1]中最大值 小于a[i]a[i]a[i],a[i]a[i]a[i]小于R[i]R[i]R[i] ~ R[n]R[n]R[n]中的最小值即可。 記為 L(i?1)<a[i]<R(i+1)L(i-1) < a[i] < R(i+1)L(i?1)<a[i]<R(i+1)
AC代碼
#include<bits/stdc++.h> using namespace std;const int N = 100010 , INF = 2e9;int n; int a[N],l[N],r[N];int main(){cin >> n;for(int i =1; i<=n; i++) cin>> a[i];//l[i]中存的是前a[1]~a[i]中最大的數,l[3]存的是a[1]到a[3]中最大的數//從前往后枚舉for(int i =1; i<= n; i++) l[i] = max(l[i-1], a[i]);//r[i]中存的是從r[i]~r[n]中最小的數//這里從后往前枚舉r[n+1] = INF;for(int i = n; i; i--) r[i] = min(r[i+1],a[i]);vector<int> res; //存放結果// 如果a[i]是分界值,放進res里面for(int i =1; i<= n; i++)if(l[i-1] < a[i] && a[i] < r[i+1]) res.push_back(a[i]);cout << res.size()<<endl;if(res.size()){cout << res[0];for(int i=1; i<res.size();i++ ) cout<<" "<<res[i];}else cout<<endl; }題目來源
PAT甲級1101 Quick Sort
https://www.acwing.com/problem/content/1593/
總結
以上是生活随笔為你收集整理的PAT甲级1101 Quick Sort:[C++题解]DP、快速排序划分个数、快排的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT甲级1093 Count PAT‘
- 下一篇: PAT甲级1048 Find Coins