• LeetCode单周赛第320场 && AcWing周赛第78场总结


    1. LeetCode单周赛第320场

    1.1 数组中不等三元组的数目

    1.1.1 原题链接:力扣icon-default.png?t=M85Bhttps://leetcode.cn/problems/number-of-unequal-triplets-in-array/

    1.1.2 解题思路:

            暴力遍历咯。

    1.1.3 代码:

    1. class Solution {
    2. public:
    3. int unequalTriplets(vector<int>& nums) {
    4. int n = nums.size();
    5. int res = 0;
    6. for(int i = 0; i < n; i ++ )
    7. for(int j = i + 1; j < n; j ++ )
    8. for(int k = j + 1; k < n; k ++ )
    9. if(nums[i] != nums[j] && nums[i] != nums[k] && nums[j] != nums[k])
    10. res ++;
    11. return res;
    12. }
    13. };

    1.2 二叉搜索树最近节点查询

    1.2.1 原题链接:力扣icon-default.png?t=M85Bhttps://leetcode.cn/problems/closest-nodes-queries-in-a-binary-search-tree/

    1.2.2 解题思路:

            1、先把树种的元素存到数组中;

            2、把数组中的元素排序,然后二分找满足要求的元素。

    1.2.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. void tra(TreeNode* root, vector<int>& t)
    15. {
    16. if(root == nullptr) return;
    17. t.push_back(root->val);
    18. tra(root->left, t);
    19. tra(root->right, t);
    20. }
    21. vector<vector<int>> closestNodes(TreeNode* root, vector& queries) {
    22. vector<vector<int>> res;
    23. vector<int> tmp;
    24. tra(root, tmp);
    25. sort(tmp.begin(), tmp.end());
    26. int n = tmp.size();
    27. for(auto& x: queries) {
    28. int a, b;
    29. int l = 0, r = n - 1;
    30. while(l < r) {
    31. int mid = l + r + 1 >> 1;
    32. if(tmp[mid] > x) r = mid - 1;
    33. else l = mid;
    34. }
    35. if(tmp[l] <= x) a = tmp[l];
    36. else a = -1;
    37. l = 0, r = n - 1;
    38. while(l < r) {
    39. int mid = l + r >> 1;
    40. if(tmp[mid] < x) l = mid + 1;
    41. else r = mid;
    42. }
    43. if(tmp[l] >= x) b = tmp[l];
    44. else b = -1;
    45. res.push_back({a, b});
    46. }
    47. return res;
    48. }
    49. };

    1.3 到达首都最少油耗

    1.3.1 原题链接:力扣icon-default.png?t=M85Bhttps://leetcode.cn/problems/minimum-fuel-cost-to-report-to-the-capital/

    1.3.2 解题思路:

            以 0 为根,统计每个子树中节点的个数cur,那么每个子树需要的车的数量就是 cur / seats 向上取整

    1.3.3 代码:

    1. #define N 100010
    2. #define M 200010
    3. int h[N], e[M], ne[M], idx;
    4. typedef long long ll;
    5. class Solution {
    6. public:
    7. ll ans = 0;
    8. void add(int a, int b)
    9. {
    10. e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
    11. }
    12. ll dfs(int u, int father, int seats)
    13. {
    14. ll cur = 1;
    15. for(int i = h[u]; i != -1; i = ne[i]){
    16. int j = e[i];
    17. if(j != father) {
    18. cur += dfs(j, u, seats);
    19. }
    20. }
    21. if(u != 0) {
    22. ans += (cur + seats - 1) / seats; //向上取整
    23. }
    24. return cur;
    25. }
    26. long long minimumFuelCost(vector<vector<int>>& roads, int seats) {
    27. memset(h, -1, sizeof h);
    28. idx = 0;
    29. for(auto& road: roads) {
    30. add(road[0], road[1]);
    31. add(road[1], road[0]);
    32. }
    33. dfs(0, -1, seats);
    34. return ans;
    35. }
    36. };

    2.AcWing周赛第78场

    2.1 商品种类

    2.1.1 原题链接:4719. 商品种类 - AcWing题库

    2.1.2 解题思路:

            使用set将产品的产地+名称存储到set中,最后返回set的大小即可。

    2.1.3 代码:

    1. #include <iostream>
    2. #include <cstring>
    3. #include <algorithm>
    4. #include <unordered_set>
    5. using namespace std;
    6. int main()
    7. {
    8. int n;
    9. cin >> n;
    10. unordered_set<string> st;
    11. for(int i = 0; i < n; i ++ ) {
    12. string a, b;
    13. cin >> a >> b;
    14. st.insert(a + ' ' + b);
    15. }
    16. cout << st.size() << endl;
    17. return 0;
    18. }

    2.2 字符串

    2.2.1 原题链接:4720. 字符串 - AcWing题库

    2.2.2 解题思路:

            把字符串 s 中的字符一个一个存到答案字符串 res 中,若与 res 中的最后一个字符相同,则把字符串 res 中的最后一个字符删去,反之,则加入到 res 中。最后输出 res 即可。

    2.2.3 代码:

    1. #include <iostream>
    2. #include <cstring>
    3. #include <algorithm>
    4. using namespace std;
    5. int main()
    6. {
    7. string s;
    8. cin >> s;
    9. string res;
    10. for(auto c: s) {
    11. if(res.size() && res.back() == c) res.pop_back();
    12. else res += c;
    13. }
    14. cout << res << endl;
    15. return 0;
    16. }

    2.3 排队

    2.3.1 原题链接:4721. 排队 - AcWing题库

    2.3.2 解题思路:

            1、用单调队列+二分的思路解决此问题;

            2、从后往前遍历身高,栈里存的是对应身高的下标,每次对栈内下标二分找到比自身矮的最右侧一个人的位置;

            3、对于栈内元素的维护,具有单调性,因为例如,对于寻找比 a[k] (k > i && k > j)的矮的最右侧的一位在哪,如果a[i], a[j]均小于a[k],且 i < j,那么,a[i]就没有存在必要了。

    2.3.3 代码:

    1. #include <iostream>
    2. #include <cstring>
    3. #include <algorithm>
    4. using namespace std;
    5. typedef long long ll;
    6. const int N = 1e5 + 10;
    7. int h[N], stk[N];
    8. int n;
    9. int ans[N];
    10. int main()
    11. {
    12. scanf("%d", &n);
    13. for(int i = 0; i < n; i ++ ) scanf("%d", &h[i]);
    14. int top = 0;
    15. for(int i = n - 1; i >= 0; i -- ) {
    16. if(!top || h[i] <= h[stk[top]]) ans[i] = -1;
    17. else {
    18. int l = 1, r = top;
    19. while(l < r) {
    20. int mid = l + r >> 1;
    21. if(h[stk[mid]] < h[i]) r = mid;
    22. else l = mid + 1;
    23. }
    24. ans[i] = stk[r] - i - 1;
    25. }
    26. if(!top || h[i] < h[stk[top]]) stk[++ top] = i;
    27. }
    28. for(int i = 0; i < n; i ++ )
    29. printf("%d ", ans[i]);
    30. return 0;
    31. }
  • 相关阅读:
    浏览器中修改视频播放速度
    C++ 之 QT --- lambda表达式
    linux系统优化措施汇总-持续更新
    【强化学习】gymnasium自定义环境并封装学习笔记
    学习笔记(11)js事件
    9.3.3网络原理(网络层IP)
    2022年金九银十,秋招Java后端开发最全面试攻略,卷对方向,才拿得到心仪的大厂offer
    31.6.2 搭建MySQL多源复制环境
    面试基础题【1】--排序算法
    SpringBoot整合阿里云OSS对象存储
  • 原文地址:https://blog.csdn.net/m0_58068094/article/details/127947668