問題描述:求乙個陣列的最大k個數,如,的最大三個數應該是,8,9,11
問題分析:
1.解法一:最直觀的做法是將陣列從大到小排序,然後選出其中最大的k個數,但是這樣的解法,複雜度是o(logn*n),但是有時候並不需要排序,用簡單的選擇排序,或者是氣泡排序,那麼就k輪的交換或者是選擇,就可以得出結論,複雜度是o(n*k),當k很大的時候排序可能是更好的解法,當k小的時候用選擇或者是冒泡效率會更加的高。但是這都是會對前k個數進行排序,所以效率不高,當k很大的時候,以上兩種方法效率都不是很高。
2.解法二:不對前k個數進行排序,回憶快排的演算法中,那個partition函式,就是隨機選擇陣列中的乙個數,把比這個數大的數,放在陣列的前面,把比這個數小的數放在陣列的
後面,這時想如果找出的隨機數,最終位置就是k,那麼最大的k個數就找出來了,沿著這個思路思考問題,但是這個函式,最後的索引位置並不一定是k,可能比k大也可能比k小,我們把找出的陣列分成兩部分sa,sb,sa是大的部分,sb是小的部分,如果sa的長度等於k的話,那麼直接返回就是最終結果,如果sa的長度要比k大的話,那麼以sa為新的陣列,從sa中找出k個最大的數,這時候就把原始資料集減少到的sa,如果sa的長度比k小的話,加入sa中有m個元素,那麼m個元素算作是k中元素的一部分,再從sb中找到,k-m個最大的元素,組合起來就是最終的結果,那麼這時把問題簡化成從sb中找k-m個最大的元素,所以總體來說這是乙個遞迴的過程,雖然複雜大也是o(n*logn)但是,每一次資料量都會減少所以會更加的快。
3.解法三:是利用堆排序,建立乙個k階最大堆,然後資料乙個個插入隊當中,那麼插入隊的時間複雜度是o(logk),適合資料量比較大的時候,用堆的效果更加好。
public class main
public static int partition(int nums,int start,int end)
if(ik)else if(length==k)else }
public static int findkmax(int nums,int k)
public static void print(int nums){
for(int i=0;i
演算法 求乙個陣列的最大子陣列
思路 1 全負數 取最大的數即可 2 存在非負數 遇見負數就不加,然後和前乙個子串行的和做比較,取大的 public class maxchildarray return items items.length 1 不是全負數的情況,sum必定大於等於0 int sum 0 int partsum 0...
求乙個陣列的最大子陣列(C C 實現)
最大子陣列 要求相連,加起來的和最大的子陣列就是乙個陣列的最大子陣列。編譯環境 vs2012,順便說句其實我是c 程式設計師,我只是喜歡學c 其實這是個半成品,還有些bug在裡面,不過總體的思路是這樣的,求最大的子陣列,由乙個中位分開,就是陣列的中間位置,然後分別求中間位置橫跨的,左邊的,和右邊的最...
求乙個陣列的子集
該題是力扣上面的乙個題,感覺思路不錯就摘抄下來做個筆記。以後準備定期耍上面的題來提高一下自己的演算法基礎。題目描述如下 給定一組不含重複元素的正數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 nums 1,2,3 輸出 3 1 2 1,2,3 1,3 2,...