1045 快速排序 25

2021-08-07 13:49:09 字數 1163 閱讀 3706

這道題對時間卡的很嚴,貌似複雜度大於o(n)會超時。

我的方法是設定乙個bool陣列對應錄入的每個值,從左到右遍歷,若當前元素小於左邊已出現的最大值,或大於右邊已出現的最小值,則他可能是主元,記錄這個位置flag=true,否則一定不是主元。遍歷一次後再順序輸出即可。

網上還有其他方法,比如排完序後主元位置不變,與當前序列比較,不變的是主元,這些方法也可以參考。

要注意的乙個坑是此時主元數量可能為0,所以最後輸出時必須判斷,若主元為0則第二行輸出空行。否則會有乙個點格式錯誤。

時間限制

200 ms

記憶體限制

65536 kb

**長度限制

8000 b

判題程式

standard

作者 cao, peng

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

例如給定n = 5, 排列是1、3、2、4、5。則:

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

int main()

int temp=0;

bool *flag=new

bool[n];

for(int i=0;itrue;

int left=arr[0];//左邊開始的最大值

int right=arr[n-1];//右邊開始的最小值

for(int i=0;iif(left>arr[i])flag[i]=false;

else left=arr[i];

if(right1-i])flag[n-1-i]=false;

else right=arr[n-1-i];

}for(int i=0;iif(flag[i])ans.push_back(arr[i]);

}cout}

else

cout0;}

1045 快速排序 25

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

1045 快速排序 25

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

1045 快速排序 25

時間限制 200 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 cao,peng 著名的快速排序演算法裡有乙個經典的劃分過程 我們通常採用某種方法取乙個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。給定劃分後的n個互...