思考:
1.題目條件式是從第一批和最後一批候選人開始搜尋->頭尾建立min-heap
2.維護頭尾的min-heap的大小在一批候選人的數量內,並且node不能重複,因為每次面試人選不重複人
3.如果cost相同優先選擇第一批
```c++=
class Solution {
public:
long long totalCost(vector<int>& costs, int k, int candidates) {
//用i和j是為了兩顆min-heap不會重複node,因為面試人選不會重複
int i = 0; // 起始
int j = costs.size() - 1; // 結束
priority_queue<int, vector<int>, greater<int>> minHeap1; // minHeap1,第一次面試人選
priority_queue<int, vector<int>, greater<int>> minHeap2; // minHeap2,第二次面試人選
//因為回傳的是long long
long long ans = 0; // 答案
//找到k個人
while(k){
// 每一個min-heap的node不超過每一次面試的人數
// 用i和j去確保兩棵樹不會有重複的node
while(minHeap1.size() < candidates && i <= j){
minHeap1.push(costs[i++]);
}
while(minHeap2.size() < candidates && i <= j){
minHeap2.push(costs[j--]);
}
// int minV1,minV2;
//檢查樹有沒有點,避免錯誤,可以寫成三元判斷式
// if(minHeap1.size() > 0){
// minV1 = minHeap1.top();
// }else{
// minV1 = INT_MAX;
// }
// if(minHeap2.size() > 0){
// minV2 = minHeap2.top();
// }else{
// minV2 = INT_MAX;
// }
int minV1 = minHeap1.size() > 0 ? minHeap1.top() : INT_MAX;
int minV2 = minHeap2.size() > 0 ? minHeap2.top() : INT_MAX;
//判斷大小
//costs相同則優先選擇第一批面試的人
if(minV1 <= minV2){
ans += minV1;
minHeap1.pop();
}
else{
ans += minV2;
minHeap2.pop();
}
k--;
}
return ans;
}
};
```
```c++=
class Solution {
public:
long long totalCost(vector<int>& costs, int k, int candidates) {
//從第一次面試和最後一次面試人選開始搜尋最小成本,k次
long long ans;
priority_queue <int, vector<int>, greater<int>> h1;
priority_queue <int, vector<int>, greater<int>> h2;
int i = 0;
int j = costs.size()-1;
while(k){
//建立兩顆min-heap
//維護兩顆tree的size,考慮每一批面試人員不重複
while(h1.size() < candidates && i <= j ){
h1.push(costs[i]);
i++;
}
while(h2.size() < candidates && i <= j){
h2.push(costs[j]);
j--;
}
int temp1 = h1.size() > 0 ? h1.top() : INT_MAX;
int temp2 = h2.size() > 0 ? h2.top() : INT_MAX;
if(temp1 <= temp2){
ans += temp1;
h1.pop();
}else{
ans += temp2;
h2.pop();
}
k--;
}
return ans;
}
};
```