第 370 场 LeetCode 周赛题解

这篇具有很好参考价值的文章主要介绍了第 370 场 LeetCode 周赛题解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

A 找到冠军 I

第 370 场 LeetCode 周赛题解,LeetCode,leetcode,算法,动态规划,离散化,树状数组

枚举求强于其他所有队的队

class Solution {
public:
    int findChampion(vector<vector<int>> &grid) {
        int n = grid.size();
        int res = 0;
        for (int i = 0; i < n; i++) {
            int t = 0;
            for (int j = 0; j < n; j++)
                if (j != i)
                    t += grid[i][j];
            if (t == n - 1) {
                res = i;
                break;
            }
        }
        return res;
    }
};

B 找到冠军 II

第 370 场 LeetCode 周赛题解,LeetCode,leetcode,算法,动态规划,离散化,树状数组
第 370 场 LeetCode 周赛题解,LeetCode,leetcode,算法,动态规划,离散化,树状数组

计数:若图中入度为 0 0 0 的点只有一个则该点为冠军,否则返回 − 1 -1 1

class Solution {
public:
    int findChampion(int n, vector<vector<int>> &edges) {
        vector<int> indeg(n);
        for (auto &ei: edges)
            indeg[ei[1]]++;
        vector<int> li;
        for (int i = 0; i < n; i++)
            if (indeg[i] == 0)
                li.push_back(i);
        if (li.size() != 1)
            return -1;
        return li[0];
    }
};


C 在树上执行操作以后得到的最大分数

第 370 场 LeetCode 周赛题解,LeetCode,leetcode,算法,动态规划,离散化,树状数组
第 370 场 LeetCode 周赛题解,LeetCode,leetcode,算法,动态规划,离散化,树状数组
第 370 场 LeetCode 周赛题解,LeetCode,leetcode,算法,动态规划,离散化,树状数组

动态规划:设 p [ c u r ] [ 0 ] p[cur][0] p[cur][0] 为在以 c u r cur cur 为根的子树上执行若干操作使得该子树是健康的 能得到的最大分数,设 p [ c u r ] [ 1 ] p[cur][1] p[cur][1] 为以 c u r cur cur 为根的子树各节点 v a l u e s values values 之和,有状态转移方程: p [ c u r ] [ 0 ] = { 0 , c u r 是叶子节点 m a x { v a l u e s [ c u r ] + ∑ j 是 c u r 的子节点 p [ j ] [ 0 ] ,    ∑ j 是 c u r 的子节点 p [ j ] [ 1 ] } , c u r 不是叶子节点 p[cur][0]=\left\{\begin{matrix} 0 & ,cur 是叶子节点\\ max\{ values[cur]+\sum_{j 是 cur的子节点} p[j][0],\;\sum_{j 是 cur的子节点} p[j][1] \} &,cur 不是叶子节点 \end{matrix}\right. p[cur][0]={0max{values[cur]+jcur的子节点p[j][0],jcur的子节点p[j][1]},cur是叶子节点,cur不是叶子节点

class Solution {
public:
    using ll = long long;

    long long maximumScoreAfterOperations(vector<vector<int>> &edges, vector<int> &values) {
        int n = edges.size() + 1;
        vector<int> e[n];
        for (auto &ei: edges) {
            e[ei[0]].push_back(ei[1]);
            e[ei[1]].push_back(ei[0]);
        }
        ll p[n][2];
        memset(p, -1, sizeof(p));//初始化状态
        function<ll(int, int, int)> get = [&](int cur, int type, int par) {//记忆化搜索
            if (p[cur][type] != -1)
                return p[cur][type];
            if (type == 0) {
                if (cur != 0 && e[cur].size() == 1)
                    return p[cur][type] = 0;
                ll r1 = 0, r2 = values[cur];
                for (auto j: e[cur])
                    if (j != par) {
                        r1 += get(j, 1, cur);
                        r2 += get(j, 0, cur);
                    }
                return p[cur][type] = max(r1, r2);
            } else {
                ll r2 = values[cur];
                for (auto j: e[cur])
                    if (j != par)
                        r2 += get(j, 1, cur);
                return p[cur][type] = r2;
            }
        };
        return get(0, 0, 0);
    }
};

D 平衡子序列的最大和

第 370 场 LeetCode 周赛题解,LeetCode,leetcode,算法,动态规划,离散化,树状数组
第 370 场 LeetCode 周赛题解,LeetCode,leetcode,算法,动态规划,离散化,树状数组

动态规划 + 离散化 + 树状数组:设数组 c [ i ] = n u m s [ i ] − i c[i]=nums[i]-i c[i]=nums[i]i ,则 c c c 数组中非降序子序列的下标序列即为平衡子序列,所有可以对 c c c 数组进行离散化,然后定义状态 p [ i ] p[i] p[i] 为: c c c 数组中末尾元素为 i i i 的非降序子序列对应的平衡子序列在 n u m s nums nums 中的最大和,有状态转移方程: p [ i ] = m a x { n u m s [ i ] m a x { p [ j ]    ∣    j ≤ i } + n u m s [ i ] p[i]=max\left\{\begin{matrix} nums[i]\\ max\{p[j] \;|\; j\le i \}+nums[i] \end{matrix}\right. p[i]=max{nums[i]max{p[j]ji}+nums[i] ,通过树状数组实现其中的前缀极值查询和单点更新文章来源地址https://www.toymoban.com/news/detail-744245.html

class Solution {
public:
    using ll = long long;
    int N;
    vector<ll> a;

    inline int lowbit(int x) {
        return x & -x;
    }

    void update(int loc, ll val) {// li[loc]=max(li[loc], val);
        for (; loc < N; loc += lowbit(loc))
            a[loc] = max(a[loc], val);
    }

    ll query(int loc) {// max{li[k] | 1<=k<=loc}
        ll res = INT64_MIN;
        for (; loc > 0; loc -= lowbit(loc))
            res = max(res, a[loc]);
        return res;
    }

    long long maxBalancedSubsequenceSum(vector<int> &nums) {
        int n = nums.size();
        vector<int> c(n);
        for (int i = 0; i < n; i++)
            c[i] = nums[i] - i;
        vector<int> t = c;
        sort(t.begin(), t.end());
        t.erase(unique(t.begin(), t.end()), t.end());
        for (int i = 0; i < n; i++)//离散化c
            c[i] = lower_bound(t.begin(), t.end(), c[i]) - t.begin();
        N = n + 1;
        a = vector<ll>(N, INT64_MIN);
        for (int i = 0; i < n; i++) {
            ll t1 = query(c[i] + 1);
            update(c[i] + 1, max(t1, 0LL) + nums[i]);
        }
        return query(n);
    }
};

到了这里,关于第 370 场 LeetCode 周赛题解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode 双周赛 104(2023/05/13)流水的动态规划,铁打的结构化思考

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 往期回顾:LeetCode 单周赛第 344 场 · 手写递归函数的通用套路 T1. 老人的数目(Easy) 标签:模拟、计数 T2. 矩阵中的和(Medium) 标签:模拟、排序 T3. 最大或值(Medium) 标签:动态规划、前后缀分解

    2024年02月04日
    浏览(58)
  • Leetcode 第 108 场双周赛 Problem C 将字符串分割为最少的美丽子字符串(动态规划)

    Leetcode 第 108 场双周赛 Problem C 将字符串分割为最少的美丽子字符串(动态规划) 题目 给你一个二进制字符串 s ,你需要将字符串分割成一个或者多个 子字符串 ,使每个子字符串都是 美丽 的。 如果一个字符串满足以下条件,我们称它是 美丽 的: 它不包含前导 0 。 它是

    2024年02月15日
    浏览(47)
  • Leetcode 第 365 场周赛题解

    思路 暴力。 代码 复杂度分析 时间复杂度:O(n 3 ),其中 n 是数组 nums 的长度。 空间复杂度:O(1)。 思路 枚举 k,我们需要知道 k 左边 nums[i]−nums[j] 的最大值。 使用 pre_max 维护 k 之前的 nums[i] 的最大值,使用 max_diff 维护 nums[i]−nums[j] 的最大值。 每次遍历一个 nums[i],都更新

    2024年02月07日
    浏览(34)
  • 第 385 场 LeetCode 周赛题解

    A 统计前后缀下标对 I 模拟 B 最长公共前缀的长度 字典树:先将 a r r 1 arr1 a rr 1 中元素加入字典树,然后遍历 a r r 2 arr2 a rr 2 中元素,在字典树上查询最长的匹配的前缀 C 出现频率最高的素数 枚举:枚举并计数各个单元格向各方向能生成的大于10的素数 D 统计前后缀下标对

    2024年02月22日
    浏览(41)
  • 第 362 场 LeetCode 周赛题解

    A 与车相交的点 数据范围小直接暴力枚举 B 判断能否在给定时间到达单元格 设起点和终点的横坐标之差的绝对值为 d x dx d x , 纵坐标之差的绝对值为 d y dy d y ,则最少需要的时间 m n mn mn 为 m a x ( d x , d y ) max(dx, dy) ma x ( d x , d y ) ,当起点终点不重合时只需要 t ≥ m n tge mn

    2024年02月09日
    浏览(33)
  • LeetCode 第385场周赛个人题解

    目录 100212. 统计前后缀下标对 I 原题链接 题目描述 接口描述 思路分析 代码详解 100229. 最长公共前缀的长度 原题链接 题目描述 接口描述 思路分析 代码详解 100217. 出现频率最高的素数 原题链接 题目描述 接口描述 思路分析 代码详解 100212. 统计前后缀下标对 II 原题链接 题目

    2024年02月19日
    浏览(77)
  • LeetCode 第 388 场周赛个人题解

    目录 100233. 重新分装苹果 原题链接 思路分析 AC代码 100247. 幸福值最大化的选择方案 原题链接 思路分析 AC代码 100251. 数组中的最短非公共子字符串 原题链接 思路分析 AC代码 100216. K 个不相交子数组的最大能量值 原题链接 思路分析 AC代码 100233. 重新分装苹果 直接模拟 降序排

    2024年03月15日
    浏览(61)
  • 第 122 场 LeetCode 双周赛题解

    A 将数组分成最小总代价的子数组 I 枚举:枚举后两个子数组的起始下标 B 判断一个数组是否可以变为有序 模拟:模拟冒泡排序的过程,若相邻元素大小关系需要交换位置,但其二进制下数位为 1 的数目不同,则返回false,若完成排序返回true C 通过操作使数组长度最小 脑筋急

    2024年01月22日
    浏览(42)
  • LeetCode 第384 场周赛题解(JavaScript版)

    废话不多说,我们来直接看题目!没参与本次周赛的小伙伴也可以先点进去自己试试看!第 384 场周赛 - 力扣(LeetCode) 好的家人们,这个第一题,我们也是必须拿下的好吧,一道非常简单的模拟送分题,它的意思是, 让我们把矩阵中,值为-1的数,变为它所在这一列最大的

    2024年02月22日
    浏览(39)
  • 【算法】动态规划 ⑦ ( LeetCode 55. 跳跃游戏 | 算法分析 | 代码示例 )

    LeetCode 55. 跳跃游戏 : https://leetcode.cn/problems/jump-game/ 给定一个 非负整数数组 nums ,你最初位于数组的 第一个下标 0 位置 。 数组中的每个元素 代表你在该位置可以 跳跃的最大长度。 判断你 是否能够到达最后一个下标。 给定一个一维数组 , 数组元素不能有负数 , 如 : {2, 2,

    2024年02月10日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包