LeetCode 2389. 和有限的最长子序列
题目链接:
2389. 和有限的最长子序列 - 力扣(LeetCode)
解题思路:
将nums从到大排序,依次枚举queries数组在nums中累加的最多的次数
class Solution { public: vector<int> answerQueries(vector<int>& nums, vector<int>& q) { int n = nums.size(), m = q.size(); vector<int> ans; sort(nums.begin(), nums.end()); for (int i = 0; i < m; i ++ ) { int j = 0, s = 0; while (j < n && s + nums[j] <= q[i]) s += nums[j ++ ]; ans.push_back(j); } return ans; } };
LeetCode 2390. 从字符串中移除星号
题目链接:
2390. 从字符串中移除星号 - 力扣(LeetCode)
解题思路:
碰见*就弹出前一个元素,否则就加上该元素:class Solution { public: string removeStars(string s) { string res; for (auto t : s) if (t == '*') res.pop_back(); else res += t; return res; } };
LeetCode 2391. 收集垃圾的最少总时间
题目链接:
Loading Question... - 力扣(LeetCode)
解题思路:
先求出garbage中所有字母的数量,在求出travel的前缀和
然后从最后遍历garbage找出3个字母分别出现的最后一个位置,加上他的前缀和即可:
class Solution { public: int garbageCollection(vector<string>& g, vector<int>& t) { int ans = 0; //求garbage中所有字母数 for (int i = 0; i < g.size(); i ++ ) ans += g[i].size(); vector<int> s(t.size() + 1, 0); //求travel前缀和 for (int i = 0, j = 1; i < t.size(); i ++ , j ++ ) s[j] = s[j - 1] + t[i]; bool st[3] = {0};//从后面枚举garbage,找出第一次出现的字母,加上其前缀和 for (int i = g.size() - 1; i >= 0 ; i -- ) for (int j = g[i].size(); j >= 0; j -- ) { if (g[i][j] == 'M' && !st[0]) ans += s[i], st[0] = true; if (g[i][j] == 'P' && !st[1]) ans += s[i], st[1] = true; if (g[i][j] == 'G' && !st[2]) ans += s[i], st[2] = true; } return ans; } };
LeetCode 2392. 给定条件下构造矩阵
题目链接:
Loading Question... - 力扣(LeetCode)
解题思路:
对于放置的每行以及每列很明显看出他们之间是互不影响的。
对于列而言:a应该放在b前面,我们只需要从a -> b连一条边,做一遍拓扑排序,第一次出队的位置即为a应该所在的位置:
若存在环则说明无解。
对于行同理:
class Solution { public: int n; vector<int> topsort(vector<vector<int>> es)//拓扑排序 { vector<vector<int>> g(n + 1); vector<int> d(n + 1); for (auto u : es) { int a = u[0], b = u[1]; g[a].push_back(b); d[b] ++ ; } queue<int> q; for (int i = 1; i <= n; i ++ ) if (!d[i]) q.push(i); vector<int> res; while (q.size()) { int t = q.front(); q.pop(); res.push_back(t); for (auto u : g[t]) { if (-- d[u] == 0) q.push(u); } } return res; } int get(vector<int> t, int x)//得到x应该在的行号或者列号 { for (int i = 0; i < n; i ++ ) if (t[i] == x) return i; return -1; } vector<vector<int>> buildMatrix(int k, vector<vector<int>>& rows, vector<vector<int>>& cols) { n = k; vector<int> row = topsort(rows);//求行topsort vector<int> col = topsort(cols);//求列topsort if (row.size() < n || col.size() < n) return {};//说明存在环,无解 vector<vector<int>> res(n, vector<int> (n)); for (int i = 1; i <= n; i ++ ) res[get(row, i)][get(col, i)] = i; return res; } };