劍指Offer 面試題30 最小的k個數

2021-08-19 21:15:46 字數 1206 閱讀 7533

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

思路:1、首先,使用快排中的思路:每進行一次快排,會確定乙個位置上的數字,使得該位置前的數字都小於該數字,而該位置後的數字都大於該數字。

2、所以,要找最小的k個數,即某一次快排時,確定的數字是在位置k或者k+1,因為當該數字在位置k上時,它前面的k-1個數字都小於它,它後面的數字都大於它,所以即找到了前k個最小的數字。另一方面,當該數字在位置k+1上時,它前面的k個數字都小於它,它後面的數字都大於它,即找到了前k個最小的數字。

3、然後對前k個最小的數字用快排進行排序即可

/*

實現:最小的k個數

*/#include

#include

using

namespace

std;

int partition(vector

& number, int start, int end)

}swap(number[j+1], number[index]);

return j + 1;

}void quicksort(vector

& number, int start, int end)

}vector

getleastnumbers_solution(vector

input, int k)

else

position = partition(input, start, end);

}vector

kminnumber;

kminnumber.assign(input.begin(), input.begin() + k);

quicksort(kminnumber, 0, kminnumber.size() - 1);

return kminnumber;

}int main()

vector

kminnumber = getleastnumbers_solution(number, k);

for (int i = 0; i < kminnumber.size(); i++)

system("pause");

return

0;}

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

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

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

題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4.題目分析 這道題最簡單的思路莫過於把n個整數排序,然後最前面的k個數就是最小的k個數,但是時間複雜度是o nlogn 我們應該想一想有沒有更快的方法。解法一 o n 的演...

《劍指offer》面試題30 最小的k 個數

劍指offer 面試題30 最小的k 個數 1.題目描述 輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,2.解題思路 1。全排序。時間複雜度o nlogn 2。partiton思想 用快速排序,時間複雜度o n 3。最大堆 時...