• 307 week contest


    这里介绍3,4题

    当天并没有参加周赛

    这是今天突然想做,1,2题能够很好的ac

    但是第三题和第四题总是存在些问题,就是简单记录一下我的思路,主要是错误答案和标准答案的思路。

    247e91a32d164341ad7a449167769097.png

     当时的思路是计算三个高度

    d1: 被感染节点的高度

    d:以被感染节点为根的树的高度

    depth:将感染节点的孩子的孩子均置为空 计算高度

    最终返回  max(depth+d1,d)

    反正整个算的就很麻烦,我感觉我的思路是ok的但是实现可能是出现问题,但还是卡了数据。

    看了官方题解,再看我写真的太蠢了

    其实本质上就是从感染点开始的路径问题

    利用一次dfs进行后续遍历

    增加一个参数记录感染的时间

    如果是根节点感染,那么子孩子感染时间加一

    如果是左子树的根节点感染 返回她感染时间然后加一 感染右子树节点

    1. class Solution {
    2. public:
    3. int max=0;
    4. int dfs(TreeNode* root, int start,int sum){
    5. if(root==NULL)return -1;
    6. if(sum==-1&&root->val==start){//本节点为感染节点
    7. sum=0;
    8. }
    9. if(sum!=-1){//本节点已感染,传递到子树中
    10. dfs(root->left,start,sum+1);
    11. dfs(root->right,start,sum+1);
    12. if(sum>max)max=sum;
    13. return sum+1;
    14. }else{
    15. int tem=dfs(root->left,start,sum);
    16. if(tem!=-1){//左子树被感染,传递到右子树
    17. sum=tem;
    18. dfs(root->right,start,sum+1);
    19. }else{//右子树被感染,传递到左子树
    20. sum=dfs(root->right,start,sum);
    21. dfs(root->left,start,sum+1);
    22. }
    23. }
    24. if(sum>max)max=sum;
    25. if(sum!=-1)return sum+1;
    26. return -1;
    27. }
    28. int amountOfTime(TreeNode* root, int start) {
    29. dfs(root,start,-1);
    30. return max;
    31. }
    32. };

    f33e9af55435423392fe46fad6213712.png

    当时想的是按照二进制进行计算,将正数负数区分开,利用二进制对其排序得到第k大序列

    测试的时候发现自己想简单了,单独的正数或负数这种方法没有问题,但是在整数范围内无法用二进制数来判断序列的大小。

    官方题解利用堆来进行求解

    最大序列为所有正数相加。

    两个操作:

    • 保留 nums[i-1]
    • 不保留 nums[i-1],增加之前减去的

    这两个操作可以认为是0,1 操作,可以确保所有序列都可以遍历到

    利用堆的排序特性,选出最大值,不断弹出

    1. class Solution {
    2. public:
    3. long long kSum(vector<int> &nums, int k) {
    4. long sum = 0L;
    5. for (int &x : nums)
    6. if (x >= 0) sum += x;
    7. else x = -x;
    8. sort(nums.begin(), nums.end());
    9. priority_queuelong, int>> pq;
    10. pq.emplace(sum, 0);
    11. while (--k) {
    12. auto[sum, i] = pq.top();
    13. pq.pop();
    14. if (i < nums.size()) {
    15. pq.emplace(sum - nums[i], i + 1); // 保留 nums[i-1]
    16. if (i) pq.emplace(sum - nums[i] + nums[i - 1], i + 1); // 不保留 nums[i-1],把之前减去的加回来
    17. }
    18. }
    19. return pq.top().first;
    20. }
    21. };

  • 相关阅读:
    深度解析NLP文本摘要技术:定义、应用与PyTorch实战
    vue3引入全局js
    docker-compose 部署 flink
    【JAVA】-- 简易超市管理系统窗口(四)(实现思路+每步代码)
    快速理解java语言
    汽车自动驾驶是人工智能吗,自动驾驶是人工智能
    【5GC】什么是5G切片?5G切片如何工作?
    如何隐藏Selenium特征实现自动化网页采集
    腾讯云4核8G和2核4G服务器五年优惠价格表
    NVIDIA Jetson Linux 35.1 “Camera” issues
  • 原文地址:https://blog.csdn.net/ltd0924/article/details/126515086