這道題對時間卡的很嚴,貌似複雜度大於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個互...