面试题 17.09. 第 k 个数
代码实现(pq)
class Solution {
public:
int getKthMagicNumber(int k) {
priority_queue<long long, vector<long long>, greater<long long>> pq;
unordered_set<long long> seen;
pq.push(1);
long long ans = -1;
for (int i = 0; i < k; i++) {
ans = pq.top();
pq.pop();
if (!seen.count(3 * ans)) {
pq.push(3 * ans);
seen.emplace(3 * ans);
}
if (!seen.count(5 * ans)) {
pq.push(5 * ans);
seen.emplace(5 * ans);
}
if (!seen.count(7 * ans)) {
pq.push(7 * ans);
seen.emplace(7 * ans);
}
}
return ans;
}
};
1424. 对角线遍历 II
代码实现(排序)
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& nums) {
vector<tuple<int, int, int>> ans;
for (int i = 0; i < nums.size(); i++) {
for (int j = 0; j < nums[i].size(); j++) {
ans.push_back({i + j, j, nums[i][j]});
}
}
sort(ans.begin(), ans.end());
vector<int> v;
for (auto[_, i, val] : ans) {
v.push_back(val);
}
return v;
}
};
842. 将数组拆分成斐波那契序列
代码实现(回溯 + 剪枝)
class Solution {
private:
bool backtrack(vector<int>& list, string num, int length, int index,
long long sum, int prev) {
if (index == length) {
return list.size() >= 3;
}
long long curr = 0;
for (int i = index; i < length; i++) {
if (i > index && num[index] == '0') {
break;
}
curr = curr * 10 + num[i] - '0';
if (curr > INT_MAX) break;
if (list.size() >= 2) {
if (curr < sum) continue;
if (curr > sum) break;
}
list.push_back(curr);
if (backtrack(list, num, length, i + 1, prev + curr, curr))
return true;
list.pop_back();
}
return false;
}
public:
vector<int> splitIntoFibonacci(string num) {
vector<int> list;
backtrack(list, num, num.length(), 0, 0, 0);
return list;
}
};