2023.3.5LeetCode第335场周赛
A. 递枕头
思路
根据奇偶性计算往前走还是往后走,取模得到答案
代码
class Solution {
public:
int passThePillow(int n, int time) {
int t = time / (n - 1);
if (t % 2) return n - time % (n - 1);
else return time % (n - 1) + 1;
}
};
B. 二叉树中的第 K 大层和
思路
BFS
找出每一层的所有节点,计算第K大和
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
long long kthLargestLevelSum(TreeNode* root, int k) {
unordered_map<int, vector<int>> mp;
queue<pair<TreeNode*, int>> q;
q.push({root, 0});
while (q.size()) {
auto t = q.front();
q.pop();
if (t.first) {
mp[t.second].push_back(t.first->val);
q.push({t.first->left, t.second + 1});
q.push({t.first->right, t.second + 1});
}
}
vector<long long> a;
for (auto [k, v] : mp) {
long long res = 0;
for (int x : v) res += x;
a.push_back(res);
}
sort(a.begin(), a.end());
if (a.size() < k) return -1;
return a[a.size() - k];
}
};
C. 分割数组使乘积互质
思路
找出所有数的质因子和所有质因子的数量
枚举每个数,若当前已有的质因子数量和总数量相等或为0,说明左右质因子没有重合,满足题意
代码
class Solution {
public:
int findValidSplit(vector<int>& nums) {
unordered_map<int, int> all; //每个质因子的数量
unordered_map<int, vector<int>> yz; //每个数的质因子
for (int x : nums) {
int t = x;
bool f = true;
if (yz.count(x)) f = false;
for (int i = 2; i <= t / i; i ++ ) {
while (t % i == 0) {
if (f)
yz[x].push_back(i);
t /= i;
all[i] ++ ;
}
}
if (t > 1) {
if (f)
yz[x].push_back(t);
all[t] ++ ;
}
}
unordered_map<int, int> cur; //当前各质因子数量
unordered_set<int> dif; //质因子数量不相等的集合
for (int i = 0; i + 1 < nums.size(); i ++ ) {
unordered_set<int> se; //当前数的因子
for (int x : yz[nums[i]]) {
cur[x] ++ ;
se.insert(x);
}
for (auto x : se) {
if (cur[x] != all[x]) dif.insert(x);
else dif.erase(x);
}
if (dif.size() == 0)
return i;
}
return -1;
}
};
D. 获得分数的方法数
思路
多重背包模板题
f[i][j]表示考虑前i个题,得分为j的数量
代码
class Solution {
public:
int waysToReachTarget(int n, vector<vector<int>>& types) {
int ans = 0;
int m = types.size();
const int mod = 1e9 + 7;
vector<vector<int>> f(m + 1, vector<int>(n + 1));
f[0][0] = 1;
for (int i = 1; i <= m; i ++ ) {
for (int j = 0; j <= n; j ++ ) {
f[i][j] = f[i - 1][j]; //不选
for (int k = 1; k <= types[i - 1][0]; k ++ ) { //选
if (j >= k * types[i - 1][1])
f[i][j] = (f[i][j] + f[i - 1][j - k * types[i - 1][1]]) % mod;
}
}
}
return f[m][n];
}
};