C 實現的O n 複雜度內查詢第K大數演算法示例

2022-10-04 00:48:12 字數 771 閱讀 7281

題目:是在一組陣列(陣列元素為整數,可正可負可為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大的值。第二種方法 用冒泡的方法,是每個元素挨著比,第一趟找出最大的數,第...