• LeetCode周赛317场 && AcWing周赛77场总结


    1.AcWing周赛77场

    1.1 4716.进球

    1.1.1 原题链接:4716. 进球 - AcWing题库

    1.1.2 解题思路:

            用哈希表保存球队的名称和对应的得分,当某个球队的得分超过 n / 2 时,则该球队就一定是胜出的球队。

    1.1.3 代码:

    1. #include <iostream>
    2. #include <cstring>
    3. #include <algorithm>
    4. #include <unordered_map>
    5. using namespace std;
    6. int main()
    7. {
    8. int n;
    9. cin >> n;
    10. unordered_map<string, int> score;
    11. for(int i = 0; i < n; i ++ ) {
    12. string s;
    13. cin >> s;
    14. score[s] ++;
    15. if(score[s] * 2 > n) {
    16. cout << s << endl;
    17. break;
    18. }
    19. }
    20. return 0;
    21. }

    1.2 4717.环形队伍

    1.2.1 原题链接:4717. 环形队伍 - AcWing题库

    1.2.2 解题思路:

            字符串res的前 n-3 项只由字符串s的前四个字符顺序构成,res最后3项由s的最后三个字符构成。

    1.2.3 代码:

    1. #include <iostream>
    2. #include <cstring>
    3. #include <algorithm>
    4. using namespace std;
    5. int main()
    6. {
    7. int n;
    8. cin >> n;
    9. string s = "ROYGBIV";
    10. string res;
    11. for(int i = 0; i < n - 3; i ++ ) res += s[i % 4];
    12. for(int i = 0; i < 3; i ++ ) res += s[i + 4];
    13. cout << res << endl;
    14. return 0;
    15. }

    2. LeetCode单周赛317场

    2.1 6233.温度转换

    2.1.1 原题链接:力扣https://leetcode.cn/problems/convert-the-temperature/

    2.1.2 解题思路:

            按图索骥。

    2.1.3 代码:

    1. class Solution {
    2. public:
    3. vector<double> convertTemperature(double celsius) {
    4. vector<double> res;
    5. res.push_back(celsius + 273.15);
    6. res.push_back(celsius * 1.80 + 32.00);
    7. return res;
    8. }
    9. };

    2.2 6234.最小公倍数为K的子数组数目

    2.2.1 原题链接:力扣https://leetcode.cn/problems/number-of-subarrays-with-lcm-equal-to-k/

    2.2.2 解题思路:

            1、先找到每个等于k的数;

            2、然后以该数为起点,想左向右遍历找到符合条件的数,组成一个子数组。

    2.2.3 代码:

    1. class Solution {
    2. public:
    3. int gcd(int a, int b)
    4. {
    5. return b ? gcd(b, a % b) : a;
    6. }
    7. int subarrayLCM(vector<int>& nums, int k) {
    8. int res = 0;
    9. int n = nums.size();
    10. int l = 0, r = 0;
    11. for(int i = 0; i < n; i ++ ) {
    12. l = 0, r = 0;
    13. if(nums[i] == k) {
    14. res ++;
    15. //往右
    16. for(int j = i + 1; j < n; j ++ ) {
    17. if(nums[j] * k / gcd(nums[j], k) == k){
    18. res ++;
    19. r ++;
    20. }
    21. else break;
    22. }
    23. //往左
    24. for(int j = i - 1; j >= 0; j -- ) {
    25. if(nums[j] == k) break;
    26. if(nums[j] * k / gcd(nums[j], k) == k){
    27. res ++;
    28. l ++;
    29. }
    30. else break;
    31. }
    32. res += l * r;
    33. }
    34. }
    35. return res;
    36. }
    37. };

    2.3 6235.逐层排序二叉树所需的最少操作数目

    2.3.1 原题链接:力扣https://leetcode.cn/contest/weekly-contest-319/problems/minimum-number-of-operations-to-sort-a-binary-tree-by-level/

    2.3.2 解题思路:

            1、把所有的元素都存入到数组中;

            2、记录每个元素的起始位置,在记录每个元素排序后的例子;

            3、建一个图,以排序后的元素指向该元素的起始位置建边;

            4、统计连通块的数量,元素的个数减去连通块的数量就是答案。

    2.3.3 代码:

    1. /**
    2. * Definition for a binary tree node.
    3. * struct TreeNode {
    4. * int val;
    5. * TreeNode *left;
    6. * TreeNode *right;
    7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
    8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
    10. * };
    11. */
    12. class Solution {
    13. public:
    14. vector<int> p;
    15. int find(int x) {
    16. if(x != p[x]) p[x] = find(p[x]);
    17. return p[x];
    18. }
    19. int minimumOperations(TreeNode* root) {
    20. queue<TreeNode*> q;
    21. q.push(root);
    22. //w:每层的序列;ls:每层的起点
    23. vector<int> w, ls;
    24. while(q.size()) {
    25. int sz = q.size();
    26. ls.push_back(w.size());
    27. for(int k = 0; k < sz; k ++ ) {
    28. auto t = q.front();
    29. q.pop();
    30. w.push_back(t->val);
    31. if(t->left) q.push(t->left);
    32. if(t->right) q.push(t->right);
    33. }
    34. }
    35. //保存每个点在原数组中的位置
    36. unordered_map<int, int> pos;
    37. for(int i = 0; i < w.size(); i ++ ) {
    38. pos[w[i]] = i;
    39. p.push_back(i);
    40. }
    41. ls.push_back(w.size());
    42. for(int i = 0; i + 1 < ls.size(); i ++ ) {
    43. sort(w.begin() + ls[i], w.begin() + ls[i + 1]);
    44. }
    45. //记录连通块的数量
    46. int cnt = w.size();
    47. for(int i = 0; i < w.size(); i ++) {
    48. int a = find(i), b = find(pos[w[i]]);
    49. if(a != b) {
    50. p[a] = b;
    51. cnt --;
    52. }
    53. }
    54. return w.size() - cnt;
    55. }
    56. };
  • 相关阅读:
    个人电脑(windows、mac)安装Docker Desktop
    【校招VIP】前端CSS/CSS3之盒模型
    数据结构-排序
    MongoDB
    使用LVS和Keepalived搭建高可用负载均衡服务器集群
    谷歌工具包之Cache
    QLC SSD适用的应用场景有哪些?附具体案例分享
    信息系统项目管理师必背核心考点(五十七)知识管理工具
    【HMS Core】华为分析服务如何监听每个Flutter页面的使用时间?
    面试算法22:链表中环的入口节点(2)
  • 原文地址:https://blog.csdn.net/m0_58068094/article/details/127830655