每日一题+周赛总结

每日一题+周赛总结

2023.12

周一 周二 周三 周四 周五 周六 周日
[12.2] 差分数组 [12.3] 滑动窗口
+周赛
[12.4]二叉树递归

12.2

一维差分数组

1094.拼车

区域性数字的加减,判断总体是否合法

回忆一下二维差分数组

12.3

前缀和

1423.可获得的最大点数 难度分:1574

逆向思维:滑动窗口 灵神太秀了

最后会剩余n-k个元素,找到剩余和最小的就行了

正向思维:

答案等于如下结果的最大值:

前 k 个数的和。
前 k−1 个数以及后 1个数的和。
前 k−2个数以及后 2 个数的和。
……
前 2个数以及后 k−2个数的和。
前 1个数以及后 k−1个数的和。
后 k个数的和。

计算前 k 个数的和,记作 s。初始化答案 ans=s
i=1 开始枚举到 i=k
每次枚举,把 s增加 cardPoints[n−i]−cardPoints[k−i],然后更新 ans的最大值


330.按要求补齐数组 374周赛q2

总结原因:tle的原因主要是在表示、更新区间的时候太复杂了,用数组存储,set表示,太复杂

抓住精髓,

​ //初始时,假设可以得到[0, s]

​ //每次新添加一个数字x,就可以得到[x+ 0, x+ s]

​ //如果这个新区间 和 已经得到的可以连续上,那么就不用添加数字,否则就是填补上最小的数字s+1

​ //如果补充数字i的话,区间就可以得到[i, 2*i-1]

12.4

1038.从二叉搜索树到更大和树

每个节点变成自身+>自身的和,所以要想更改当前节点的值,必须遍历累加比自身大的节点

这是二叉搜索树,采用递归方法,利用他右子树的数值都比较大的特点

递归顺序:右子树-根-左子树

    int s = 0;
    void dfs(TreeNode *node) {
        if (node == nullptr) {
            return;
        }
        dfs(node->right); // 递归右子树
        s += node->val;		
        node->val = s; // 根,此时 s 就是 >= node->val 的所有数之和
        dfs(node->left); // 递归左子树
    }
posted @ 2023-12-03 13:58  小柴cyl  阅读(38)  评论(0)    收藏  举报
/*粒子线条,鼠标移动会以鼠标为中心吸附的特效*/