劍指offer(C ) 最小的K個數

2021-09-25 16:02:52 字數 980 閱讀 6371

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。
(平均時間複雜度為o(n)): 它會修改輸入的陣列

思想:基於partion函式來解決這個問題。如果基於陣列的第k個數字來調整,使得比第k個數字小的所有數字都位於陣列的左邊,比第k個數字大的所有數字都位於陣列的右邊。這樣調整之後,位於陣列中左邊的k個數字就是最小的k個數字(這k個數字不一定是排序的)。

class solution 

input[low] = pivotkey;

return low;

}

vectorgetleastnumbers_solution(vectorinput, int k)

else

}vectorres(input.begin(), input.begin() + k);

return res;

}};

(時間複雜度為o(nlogk)):不必一次載入所有的資料到記憶體,適合從海量的資料中找出最小的k個數

思想:用multiset儲存最小的k個數字。每次讀入乙個數,如果容器中已有的數字少於k個,則直接把這次讀入的整數放入容器之中;如果容器中已有k個數字,則比較讀入的數字和容器中最大的數字,如果前者大,則在容器中用前者替換後者;如果後者大,則前者不可能是最下的k個數之一

typedef multiset> intset; //這裡我們採用遞減排序。預設的是less,預設採用的是遞增排序

typedef multiset>::iterator setiterator;

//在data中尋找最小的k個數儲存到leastnumbers中

void getleastnumbers(const vector&data, intset &leastnumbers, int k)

else}}

}

劍指offer 最小k個數

1.題目 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,2.方法 1 基於堆排序演算法,構建最大堆。時間複雜度為o nlogk 2 如果用快速排序,時間複雜度為o nlogn 3 如果用插入排序,時間複雜度為o n 2 3.演...

劍指offer 最小的K個數

華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 10 4 題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,解析 基於插入排序的思想可以想到使用乙個長度為k的排序陣列儲存最小的k個元素,複雜度o nk 基於...

《劍指offer》最小的K個數

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,輸入給整數陣列,和k 找出其中最小的k個數 class solution 1 先用插入排序對陣列中數進行排序。2 取出有序陣列中最小的kge。附 這只是乙個比較簡單的方法。如果考慮...