40 最小的k個數

2021-10-03 10:59:35 字數 1025 閱讀 5652

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

示例 1:

輸入:arr = [3,2,1], k = 2

輸出:[1,2] 或者 [2,1]

示例 2:

輸入:arr = [0,1,2,1], k = 1

輸出:[0]

限制:

分情況討論:1-》當陣列的大小較小,並行可以進行改變是,可以使用快速排序的方法,找對第k大的數,這個時候前面的k個數就是較小的k個數。

2-》當原陣列不可改變,且陣列非常大的時候,方法一不在適用,可以使用乙個堆來儲存前k個大小的數,實現動態比較儲存。

解法一(改變原陣列順序):

class solution  else

}return vector(arr.begin(),arr.begin() + index+1);

}int partition(vector& nums,int low,int high)

nums[i] = pivot;

return i;

}};

可以使用乙個大小為k的大頂堆來存放k個數,當堆不滿的時候,直接放入;當堆滿時,將數與堆頂元素進行比較,如果來的數字比堆頂元素要小,刪除堆頂元素,插入新數,否則拋棄。

知識點:利用multiset實現堆排序,multiset erase函式,insert函式的使用

解法二(利用stl中multiset使用紅黑樹實現的性質 實現大頂堆)

class solution 

}return vector(result.begin(),result.end());

}};

40 最小的K個數

輸入n個整數,找出其中最小的k個數。例如,輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4.通過快速排序,每次確定基準資料的位置,根據快速排序的特性,位置左側的資料均小於基準資料,位置右側的資料均大於資料,直至該位置等於k 1時,左邊的資料恰好是最小的k個數。如下 pu...

40 最小的k個數

輸入整數陣列 arr 找出其中最小的 k 個數。例如,輸入4 5 1 6 2 7 3 8這8個數字,則最小的4個數字是1 2 3 4。示例 1 輸入 arr 3,2,1 k 2 輸出 1,2 或者 2,1 示例 2 輸入 arr 0,1,2,1 k 1 輸出 0 class solution que...

第40題 最小的K個數

輸入n個整數,找出其中最小的k個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,法1,std sort。快排onlogn class solution return ret 法2.partiton on include using namespace std ...