日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

剑指Offer——面试题30:最小的K个数

發布時間:2025/3/17 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 剑指Offer——面试题30:最小的K个数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:輸入N個數字,找出其中最小的K個數。

思路:維護一個數組KMin,長度為K,存放最小的K個數。遍歷原始數組的過程中,如果KMin不滿,就直接在后邊插入新的數字;如果KMin滿了,就要找到其中最大的數字,和當前遍歷原始數組時遇到的數字進行比較,決定是否更新。由于每次都要獲得KMin中最大的數字,所以可以把KMin用一個大頂堆來實現,當KMin滿了的時候,就建堆,之后在每次遍歷時,都用當前遍歷得到的元素與KMin的堆頂比較,決定是否更新,如果更新,就維護堆。其中建堆過程和維護堆的過程共用一個函數AdjustHeap來描述。算法用C/C++實現。

void AdjustHeap(int* const arr, const int length){for(int i = length / 2 - 1; i >= 0; i--){int temp = arr[i];int k = 0;for(int j = i * 2 + 1; j < length; j = k * 2 + 1){k = j;if(j + 1 < length)k = arr[j] > arr[j + 1] ? j : j + 1;if(arr[k] > arr[i]){arr[(j - 1) / 2] = arr[k];arr[k] = temp;}else break;}} }int* GetKMin(int* const arr, const int length, const int K){if(K <= 0) return NULL;int* KMin = new int[K];for(int i = 0; i < length; i++){if(i <= K)KMin[i] = arr[i];if(i == K)AdjustHeap(KMin, K);if(i > K)if(arr[i] < KMin[0]){KMin[0] = arr[i];AdjustHeap(KMin, K);}}return KMin; }

  

測試代碼:

int main(){const int K = 5;const int B = 10;static int TestBase[B] = {6, 2, 20, 13, 9, 11, 7, 5, 1, 8};static int TestBase2[B] = {6, 2, 20, 13, 9, 11, 7, 5, 1, 6};int i = 0;for(i = 0; i < B; i++) cout << TestBase[i] << " ";cout << endl;int * KMin = GetKMin(TestBase, B, K);if(KMin)for(i = 0; i < K && i < B; i++) cout << KMin[i] << " ";cout << endl;return 0; }

  

測試用例:

K = 5, B = 10;

K = 1, B = 10;

K = 0, B = 10;

K = -1, B = 10;

K = 15, B = 10;

還可以使用TestBase和TestBase2分別測試原始數組中是否有重復元素。

轉載于:https://www.cnblogs.com/superpig0501/p/3980513.html

總結

以上是生活随笔為你收集整理的剑指Offer——面试题30:最小的K个数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。