最小的k個數

2021-07-29 23:39:54 字數 1189 閱讀 6621

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。

直接sort函式,返回前k個

時間複雜度o(nlogn)

時間複雜度o(k*n)

class solution 

haha.push_back(input[i]);

}return haha;

}};

維護容量為k的最大堆

用容量為k的最大堆儲存最先遍歷到的k個數,同樣假設它們即是最小的k個數

遍歷剩餘n-k個數。假設每一次遍歷到的新的元素的值為x,把x與堆頂元素kmax比較:如果x < kmax,用x替換kmax,然後更新堆(用時logk);否則不更新堆。

時間複雜度:o(k+(n-k)*logk)=o(n*logk)

class solution 

}return haha;

}private:

void adjustheap(vector

& input, int i)

}void makeheap(vector

& input)

}};

選取s中乙個元素作為樞紐元v,將集合s-分割成s1和s2,就像快速排序那樣

如果k <= |s1|,那麼第k個最小元素必然在s1中,返回quickselect(s1, k)。

如果k = 1 + |s1|,那麼樞紐元素就是第k個最小元素,即找到,直接返回它。

否則,這第k個最小元素就在s2中,即s2中的第(k - |s1| - 1)個最小元素,我們遞迴呼叫並返回quickselect(s2, k - |s1| - 1)。

class solution 

return haha;

}private:

void quickselect(vector

& input, int left, int right, int k)

}swap(input[left], input[i]);

quickselect(input, i + 1, right, k - i - 1 + left);

quickselect(input, left, i - 1, k); //用i-1而不是i,防止如(1,1,1)的死迴圈

}};

最小的K個數

問題描述 給定的n個整數,計算其中最小的k個數。最直觀的解法莫過於將n個數按公升序排列後輸出前k個。但是就效率來看,這種方法並不是最理想的。一種改進方法是借助快速排序中對陣列的劃分,以第k個元素對陣列進行劃分,使得比第k個數字小的數字都在其左邊,比其大的數字都在它的右邊。void swap int ...

最小的K個數

從 陣列中出現次數超過一半的數字 得到啟發,同樣可以基於partition函式來解決。一 o n 演算法 void getleastnumbers int input,int n,int output,int k else for int i 0 i k i output i input i 二 o...

最小的K個數

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,如果不讓使用sort的話,自己實現乙個,或者依次選取最小的 class solution public vectorgetleastnumbers solution vectori...