• LeetCode地平线专场——第308场周赛题解


    前言:很久没做周赛了,上次做周赛还是本科期间(两年前),因为过几个月就要找实习了,所以最近开始打周赛,希望能继续加油。

    上次打周赛还是两年前

    贪心+前缀和:6160. 和有限的最长子序列

    这题的关键是读懂子序列的含义:

    子序列 是由一个数组删除某些元素(也可以不删除)但不改变剩余元素顺序得到的一个数组。

    所以这个子序列可以是整个序列中任意的一部分,这一部分可以是不连续的一部分。所以我们要找出最长的子序列,只需要找到最小的N个子序列。这其实是一种贪心方法,我们排序后,求出当前和数组nums_sum。然后确定当前query比nums_sum[i]小的下标,添加到ans当中。

    1. class Solution {
    2. public:
    3. vector<int> answerQueries(vector<int>& nums, vector<int>& queries) {
    4. vector<int> ans;
    5. // 排序后找最小序列和
    6. sort(nums.begin(), nums.end());
    7. int nums_sum[nums.size()];
    8. nums_sum[0] = nums[0];
    9. for (int i = 1; i < nums.size(); i++) {
    10. nums_sum[i] = (nums[i] + nums_sum[i - 1]);
    11. }
    12. for (int i = 0; i < queries.size(); i ++) {
    13. if (queries[i] < nums_sum[0]) {
    14. ans.push_back(0);
    15. if (queries.size() == 1) {
    16. return ans;
    17. }
    18. // continue;
    19. } else if (queries[i] >= nums_sum[nums.size() - 1]) {
    20. ans.push_back(nums.size());
    21. // continue;
    22. } else {
    23. for (int j = 0; j < nums.size(); j++) {
    24. if (queries[i] < nums_sum[j]) {
    25. ans.push_back(j);
    26. break;
    27. }
    28. }
    29. }
    30. }
    31. return ans;
    32. }
    33. };

    字符串:6161. 从字符串中移除星号

    这题就是一个非常简单的字符串操作。所有涉及字符串删除的操作,新建一个比在原字符串上删除操作更方便!

    1. class Solution {
    2. public:
    3. string removeStars(string s) {
    4. string ans = "";
    5. if (s.empty()) {
    6. return ans;
    7. }
    8. for (int i = 0; i < s.size(); i++) {
    9. if (s[i] == '*') {
    10. ans.pop_back();
    11. } else {
    12. ans.push_back(s[i]);
    13. }
    14. }
    15. return ans;
    16. }
    17. };

    模拟法:6162. 收集垃圾的最少总时间

    分三步:

    1、先找到每种垃圾最后一次出现的index,此时每次出现M、P、G都在ans上直接加1.

    2、根据最后一次出现的index,计算计算travel。

    3、将表示M、P、G的ans[0]、ans[1]、ans[2]相加返回答案。

    1. class Solution {
    2. public:
    3. int garbageCollection(vector<string>& garbage, vector<int>& travel) {
    4. int ans[3]; // m p g
    5. for (int i = 0; i < 3; i++) {
    6. ans[i] = 0;
    7. }
    8. // 先找到每种垃圾最后一次出现的index
    9. int index[3]; // m p g
    10. for (int i = 0; i < 3; i++) {
    11. index[i] = -1;
    12. }
    13. for (int i = 0; i < garbage.size(); i++) {
    14. for (int j = 0;j < garbage[i].size(); j++) {
    15. if (garbage[i][j] == 'M') {
    16. index[0] = i;
    17. ans[0] ++;
    18. } else if (garbage[i][j] == 'P') {
    19. index[1] = i;
    20. ans[1] ++;
    21. } else if (garbage[i][j] == 'G') {
    22. index[2] = i;
    23. ans[2] ++;
    24. }
    25. }
    26. }
    27. // 计算travel
    28. for (int i = 0; i < 3; i++) {
    29. if (index[i] == -1) {
    30. continue;
    31. }
    32. for (int j = 0; j < index[i]; j++) {
    33. ans[i] += travel[j];
    34. }
    35. }
    36. return ans[0] + ans[1] + ans[2];
    37. // for (int i = 0; i < garbage.size(); i++) {
    38. // for (int j = 0; j < garbage[i].size(); j++) {
    39. // // M
    40. // if (flagm == true && i > 0) {
    41. // ansm += travel[i - 1];
    42. // }
    43. // if (garbage[i][j] == 'M') {
    44. // ansm ++;
    45. // flagm = true;
    46. // }
    47. // // P
    48. // if (flagp == true && i > 0) {
    49. // ansm += travel[i - 1];
    50. // }
    51. // if (garbage[i][j] == 'P') {
    52. // ansp ++;
    53. // flagp = true;
    54. // }
    55. // // G
    56. // if (flagg == true && i > 0) {
    57. // ansm += travel[i - 1];
    58. // }
    59. // if (garbage[i][j] == 'G') {
    60. // ansg ++;
    61. // flagg = true;
    62. // }
    63. // }
    64. // }
    65. // return ansm+ansp+ansg;
    66. }
    67. };

    拓扑排序:6163. 给定条件下构造矩阵

     没时间写了,很久没打比赛手速很慢,贴一个大佬的答案,下周继续加油吧~

    分别对行列的条件约束进行两次拓扑排序:

    1. class Solution:
    2. def buildMatrix(self, k: int, rowConditions: List[List[int]], colConditions: List[List[int]]) -> List[List[int]]:
    3. def topo(edges):
    4. web = [[] for _ in range(k + 1)]
    5. ind = [0] * (k + 1)
    6. for u, v in edges:
    7. web[u].append(v)
    8. ind[v] += 1
    9. q = [u for u in range(1, k + 1) if not ind[u]]
    10. head, tail = 0, len(q)
    11. while head < tail:
    12. u = q[head]
    13. head += 1
    14. for v in web[u]:
    15. ind[v] -= 1
    16. if not ind[v]:
    17. q.append(v)
    18. tail += 1
    19. return q if tail == k else []
    20. A, B = topo(rowConditions), topo(colConditions)
    21. if not A or not B: return []
    22. # 从拓扑序列中找到 val 的行列位置
    23. pos = [[0, 0] for _ in range(k + 1)]
    24. for idx, (k1, k2) in enumerate(zip(A, B)):
    25. pos[k1][0] = pos[k2][1] = idx
    26. # 填数字呀
    27. res = [[0] * k for _ in range(k)]
    28. for val, (x, y) in enumerate(pos[1:], 1):
    29. res[x][y] = val
    30. return res
  • 相关阅读:
    SVN常用操作
    【infiniband】用udaddy测试RDMA_CM API通过GID连接
    6G网络需求、架构及技术趋势
    云备份——服务器业务处理模块以及网络通信模块
    你真的研究过对象数组去重吗?
    NL2SQL技术方案系列(5):金融领域NL2SQL技术方案以及行业案例实战讲解3--非LLM技术方案
    【Flink】入门Demo实现、Flink运行架构之运行时组件,任务提交流程,任务调度原理
    京东面试官:在Mybatis中 Dao接口和XML文件的SQL如何建立关联?
    vue-cli3.0初始化项目
    (10)svelte 教程:Slots
  • 原文地址:https://blog.csdn.net/qq_41895747/article/details/126568286