思路一(很瓜的思路):
遍歷資料的同時更新該資料左邊的最大值
將原資料從小到大排序後放入另外乙個陣列中,再將這些資料存在另外乙個陣列的對應下標裡作為右方最小值
遍歷資料時,若當前右方最小值等於該資料,將對應元素置零,右方最小值變為後邊的第乙個非零值
採用思路一可以求解,然而存放右方最小值的陣列大小達到了109,該思路行不通
上網查詢,參考該部落格的思路二,三,寫下**
思路2
#include
#include
using
namespace std;
//num3是排好序的陣列,num2是左邊最大值陣列
int num1[
100004
], num2[
100004
], num3[
100004
], num4[
100004];
intmain()
sort
(&num3[0]
,&num3[n]);
int cnt =0;
for(
int i =
0; i < n; i++)if
(num1[i]
==num3[i]
&& num1[i]
>= num2[i]
) num4[cnt++
]= num1[i];if
(0!= cnt)
else
printf
("0\n\n");
}
思路3:
#include
#include
using
namespace std;
//num2存放該位置上的左方最大值,num3存放右方最小值,包括自己
int num1[
100004
], num2[
100004
], num3[
100004
], num4[
100004];
intmain()
int min = num1[n-1]
;for
(int i = n-
1; i >=
0; i--
)int cnt =0;
for(
int i =
0; i < n; i++)if
(num1[i]
>=num2[i]
&& num1[i]
<= num3[i]
) num4[cnt++
]= num1[i];if
(0!= cnt)
else
printf
("0\n\n");
}
注意:測試點2是沒有主元的情況,需要printf(「0\n\n」);語句
反思:看見排序和25就先入為主想複雜了,這題真的不該
1045 快速排序
如果按照題目正常寫的話就只有第乙個點能通過,結果超時,後來觀察到可以和排好序的陣列比較,數字相等的時候才能算,但是也有一半的點是不能通過的,後來,想到了如果有兩個相同的數字,那麼在排序的過程中,兩個數字就是挨著的,那麼就沒辦法與未排序的陣列一一對應了,這樣就判斷一下,需要判斷的數字是否比之前的最大值...
1045 快速排序
著名的快速排序演算法裡有乙個經典的劃分過程 我們通常採用某種方法取乙個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。給定劃分後的 n 個互不相同的正整數的排列,請問有多少個元素可能是劃分前選取的主元?例如給定 n 5 n 5 排列是1 3 2 4 5。則 1 的左...
1045 快速排序
1045 快速排序 25 分 著名的快速排序演算法裡有乙個經典的劃分過程 我們通常採用某種方法取乙個元素作為主元,通過交換,把比主元小的元素放到它的左邊,比主元大的元素放到它的右邊。給定劃分後的 n 個互不相同的正整數的排列,請問有多少個元素可能是劃分前選取的主元?例如給定 n 5 排列是1 3 2...