
題目解析:找出陣列中第 k 大的數字,且不需要將整個陣列完整排序
解題思路:設一個由小到大排的優先佇列 v 來裝目前前 k 大的數字。丟進迴圈把數字一個個拿出來,如果佇列還沒滿 k 個就直接塞。如果滿了,就拿當前數字跟佇列最上面(目前的第 k 大)比,如果比較大就把最上面的拔掉,換新的進去。迴圈跑完,最上面的數字就是答案
class Solution {
public:
int findKthLargest(vector& nums, int k) {
priority_queue, greater> v;
for(int i=0; i v.top()){
v.pop();
v.push(nums[i]);
}
}
return v.top();
}
};

題目解析:找出所有相加總和為 n 的 k 個數字組合,只能用 1 到 9 的數字,且每個數字最多用一次。
解題思路:設陣列 ans 裝所有組合,陣列 v 裝目前的數字。寫一個 dfs 遞迴函數,傳入起始數字、k 跟還要湊的總和。迴圈從起始數字跑到 9,如果數字超過剩餘總和就提早中斷。不然就把數字塞進 v,繼續遞迴找下一個數,找完把數字拔出來回溯。當收集滿 k 個數且剩餘總和剛好為 0,就把 v 塞進 ans,最後回傳 ans
class Solution {
public:
vector> ans;
vector v;
void dfs(int start, int k, int remain) {
if (v.size() == k) {
if (remain == 0) ans.push_back(v);
return;
}
for (int i = start; i <= 9; i++) {
if (i > remain) break;
v.push_back(i);
dfs(i + 1, k, remain - i);
v.pop_back();
}
}
vector> combinationSum3(int k, int n) {
dfs(1, k, n);
return ans;
}
};