PAT B 1045 快速排序 25

2021-07-29 03:15:03 字數 1177 閱讀 9895

題目鏈結在此。

結合這道題一起看。

思路其實已經在題幹中給出了,關鍵點就在如何表達這個「思路」上。

如果暴力判斷的話,肯定是超時的。

將題幹思路再深入一層:要判斷乙個點可不可能是主元,主要判斷它左邊的數都小於它,它右邊的數都大於它。它左邊的數小於它深入一層就是它左邊最大的數都小於它;同理,右邊的數都大於它深入一層就是它右邊的最小的數都大於它。

用兩個陣列leftmax和rightmin,leftmax[i]和rightmin[i]分別表示i左邊最大的數和i右邊最小的數,這樣一來,判斷a[i]是不是主元,只需要判斷a[i]>leftmax[i] && a[i]

#include

#include

#include

using

namespace

std;

int n;

long

long a[100010], ans[100010], num = 0;

//leftmax[i]儲存第i位左邊的最大值,rightmin[i]儲存第i位右邊的最小值

long

long leftmax[100010], rightmin[100010];

long

long inf = 1

<<31-1; //定義成int inf = 1<<31-1 --> 第二個測試點就格式錯誤

int main()

//填寫leftmax

leftmax[0] = 0;

for(int i = 1; i < n; i++)else

} //填寫rightmin

rightmin[n-1] = inf;

for(int i = n-2; i >= 0; i--)else

} //找可能是主元的數

for(int i = 0; i < n; i++)

} //列印結果

printf("%lld\n",num);

sort(ans,ans+num);

for(int k = 0; k < num; k++)else

} printf("\n");

return

0;}

注:對於inf的資料型別的疑問已經寫在備註……問了晴神,等待答覆……

有知道的小夥伴現在告訴我真是極好的~

PAT B1045 快速排序 25

著名的快速排序演算法裡有乙個經典的劃分過程 我們通常採用某種方法取乙個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。給定劃分後的n個互不相同的正整數的排列,請問有多少個元素可能是劃分前選取的主元?例如給定n 5,排列是1 3 2 4 5。則 1的左邊沒有元素,右邊...

PATB1045 快速排序(25)

知識點筆記 用兩個陣列leftmax和rightmin,leftmax i 和rightmin i 分別表示i左邊最大的數和i右邊最小的數,這樣一來,判斷a i 是不是主元,只需要判斷a i leftmax i a i ac include include include using namespa...

PAT B1045 快速排序

513 245314 5本題需要使用乙個技巧,先記錄每個位上之前出現過的最大數,以及每位上之後出現過的最小數,再遍歷整個陣列,如果當前數比之前的數大,比之後的數小,則為主元。const int inf 0x3fffffff 定義了乙個很大的數 注意本題結束後必須要有換行,否則有個測試點會報格式錯誤 ...