面試題30 最小的k個數

2021-07-16 05:56:03 字數 1865 閱讀 5131

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

分析:方法一,可以採用類似快速排序的解法,基於陣列中第k個數來進行調整,使得比第k個數字大的所有數字都在陣列的右邊,小的都在第k個數字的左邊。

方法二:可以建立乙個大小為k的容器來儲存最小的k個數,如果容器中的書少於k個,則直接把讀入的整數放入容器中,如果容器滿了,此時得找出這k個數中的最大值,再拿這次待插入的值和最大值進行比較,如果比它大,則不進行插入,如果比它小,則替換k個數中的最大值,直到陣列中的所有數訪問完,則最後容器中的數就是k個最小的數。應為當容器滿的時候,每次得計算容器中的最大值,為了在短時間內計算出最大值,可以採用類似紅黑樹的結構,假設k個節點,則可以在lg(k)的時間內找出最大值。

原始碼:

/**

* 功能說明:description

* 日期:2016-7-22

**/#include#include#includeusing namespace std;

typedef multiset> intset;

typedef multiset>::iterator setiterator;

//產生隨機數

int randominrange(int min, int max);

//交換兩個數值

void swap(int* num1, int* num2);

//基於快速排序的劃分

int partition(int data, int length, int start, int end);

//基於快速排序的解法

void getleastnumbers_solution1(int* input, int n, int* output, int k);

//基於替換的解法

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

int main()

; vectorvectordata;

for(int i = 0; i < 8; ++ i)

vectordata.push_back(data[i]);

int k=4;

int* output = new int[k];

cout<<"solution 1: "<= length)

throw new std::exception("invalid parameters");

int index = randominrange(start, end);

swap(&data[index], &data[end]);

int small = start - 1;

for (index = start; index < end; ++index) }

++small;

swap(&data[small], &data[end]);

return small;

}int randominrange(int min, int max)

void swap(int* num1, int* num2)

void getleastnumbers_solution1(int* input, int n, int* output, int k)

else

}for(int i = 0; i < k; ++i)

output[i] = input[i];

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

} }}

面試題30 最小的k個數

題目 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4.思路1,同29題一樣,利用快排思想,醉倒第k大的數,它左邊都比它小即可。o n 2,適合海量資料,利用堆資料結果,取數o 1 刪除和插入需要o k 總共n個數,時間複雜度o ...

面試題30 最小的k個數

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4。思路1 按遞增排序,然後輸出前k個數,簡單粗暴,時間複雜度o nlogn 思路2 利用partition演算法,找到第k大數,輸出其左邊k個數,時間複雜度o n 思路3 開乙個規模...

劍指offer 面試題30 最小的K個數

題目 輸入n個數,找出其中最小的k個數。例如輸入4 5 1 6 2 7 3 8這8個數字,則最小的4個數字是1,2,3,4。思路 這道題目是典型的top k問題。兩種方法 1 如果允許改變量列,半快速排序,是基準值正好為第k個數,那麼基準值左邊的都是小於它的,即可得到最小的k個數 求最大的過程類似 ...