題目列表
面試題 17.14. 最小K個數
示例
輸入: arr = [1,3,5,7,2,4,6,8], k = 4
輸出: [1,2,3,4]
提示
- 0 <= len(arr) <= 100000
- 0 <= k <= min(100000, len(arr))
class Solution {
public:
vector<int> smallestK(vector<int>& arr, int k) {
for(int i = 0; i < arr.size(); i++)
{
heapInsert(arr, i);
}
vector<int> res;
int heapSize = arr.size();
for(int i = 0; i < k; i++)
{
res.push_back(arr[0]);
swap(arr[0], arr[--heapSize]);
heapify(arr, 0,heapSize);
}
return res;
}
void heapInsert(vector<int>& arr, int index)
{
while(arr[index] < arr[(index-1)/2])
{
swap(arr[index], arr[(index-1)/2]);
index = (index-1)/2;
}
}
void heapify(vector<int>& arr, int index, int k)
{
int left = index *2 + 1;
while(left < k)
{
int largest = (left+1 < k)&& (arr[left+1] < arr[left])? left+1:left;
largest = arr[largest] < arr[index] ? largest:index;
if(index == largest)
break;
swap(arr[index], arr[largest]);
index = largest;
left = index * 2 +1;
}
}
};
未完待續。。。