題目:是在一組陣列(陣列元素為整數,可正可負可為0)中查詢乘積最大的三個數,最後輸出最大乘積。
從題目我們知道只有兩種結果存在:
1)三個最大的正整數相乘;
2)乙個最大的正整數和兩個最小的負數相乘。
所以我們需要找出陣列中最大的三個數的乘積m,然後與陣列中最小的兩個數相乘再與最大的數相乘的結果n,然後比較m,n,選出最大的數即為最終的結果。
參考**:
實現**:
#include
#include
//分割槽
int partition(std::vector&ve start,int end)
int main()
int k;
//最大的數,index為n-1
k = n - 1;
long long x1 = solve(vec_i,0, n-1,k);
//次大的數,index為n-2
k = n - 2;
long long x2 = solve(vec_i,0, n-2,k);
/第三大的數
k = n - 3;
long lo x3 = solve(vec_i,0, n-3,k);
long long ans = x1 * x2 * x3;//最大的三個數的乘積
if(n > 3)
std::cout<
本文標題: c++實現的o(n)複雜度內查詢第k大數演算法示例
本文位址: ruanjian/c/199840.html
求第k小的數 O n 複雜度
利用快速排序的思想,把陣列遞迴劃分成兩部分。設劃分為x,陣列左邊是小於等於x,右邊大於x。關鍵在於尋找乙個最優的劃分,經過 blum floyd pratt rivest tarjan五位大牛的研究總結,提出了bfprt 演算法 也就是中位數的中位數演算法 利用中位數的中位數演算法得到的數作為劃分可...
找第k大數,最壞時間複雜度O n
以前寫過的一篇,搬過來。上演算法課的時候聽到老師講這個問題,覺得還是蠻有意思的。已知陣列a,找出a m a p 中的第k大值。很容易想到快排和冒泡。第一種方法 用快排的分治方法,是先任意找陣列中的乙個元素a a用陣列的第乙個元素比較方便 然後進行一次劃分,就是將陣列中所有大於a的數都移到a的一邊,所...
找第k大數,最壞時間複雜度O n
第一種方法 用快排的分治方法,是先任意找陣列中的乙個元素a a用陣列的第乙個元素比較方便 然後進行一次劃分,就是將陣列中所有大於a的數都移到a的一邊,所有小於等於a的數都移到a的另一邊。然後選擇在哪邊繼續進行劃分,最後找到第k大的值。第二種方法 用冒泡的方法,是每個元素挨著比,第一趟找出最大的數,第...