第 355 场 LeetCode 周赛

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

A 按分隔符拆分字符串

第 355 场 LeetCode 周赛,LeetCode,leetcode,算法,贪心算法,dfs,哈希

简单模拟

class Solution {
public:
    vector<string> splitWordsBySeparator(vector<string> &words, char separator) {
        vector<string> res;
        for (auto &s: words) {
            int n = s.size();
            for (int i = 0, j = 0; i < n;) {
                while (j < n && s[j] != separator)
                    j++;
                if (i < j)
                    res.push_back(s.substr(i, j - i));
                i = j + 1;
                j = i;
            }
        }
        return res;
    }
};

B 合并后数组中的最大元素

第 355 场 LeetCode 周赛,LeetCode,leetcode,算法,贪心算法,dfs,哈希

倒序遍历数组, 计算当前最右元素可以合并生成的最大元素

class Solution {
public:
    typedef long long ll;

    long long maxArrayValue(vector<int> &nums) {
        int n = nums.size();
        ll cur = nums[n - 1];//生成的当前元素
        ll res = nums[n - 1];
        for (int i = n - 2; i >= 0; i--) {
            if (nums[i] <= cur) {
                cur += nums[i];
            } else {//以nums[i]为新的最右元素
                cur = nums[i];
            }
            res = max(res, cur);
        }
        return res;
    }
};

C 长度递增组的最大数目

第 355 场 LeetCode 周赛,LeetCode,leetcode,算法,贪心算法,dfs,哈希

先放个赛事凑出来的二分占位(不知道会不会被rejudge),后续看看能不能补个证明或贴个其他方法…

class Solution {
public:
    typedef long long ll;

    int maxIncreasingGroups(vector<int> &usageLimits) {
        sort(usageLimits.begin(), usageLimits.end(), greater<>());
        int n = usageLimits.size();
        int l = 1, r = n;
        while (l < r) {
            int mid = (l + r + 1) / 2;
            ll cur = 0;
            for (int i = 0; i < n; i++) {
                if (i + 1 <= mid)
                    cur = min(1LL * (i + 1) * (mid * 2 - i) / 2, cur + usageLimits[i]);
                else
                    cur += usageLimits[i];
            }
            if (cur >= 1LL * mid * (mid + 1) / 2)
                l = mid;
            else
                r = mid - 1;
        }
        return l;
    }
};

D 树中可以形成回文的路径数

第 355 场 LeetCode 周赛,LeetCode,leetcode,算法,贪心算法,dfs,哈希

dfs+计数: 设 u , v u,v u,v两点之间路径上各字符数量的奇偶组成状态为 m a s k mask mask, u u u和根节点之间路径上各字符数量的奇偶组成状态为 m a s k u mask_u masku, v v v和根节点之间路径上各字符数量的奇偶组成状态为 m a s k v mask_v maskv, 则有 m a s k = m a s k u ∧ m a s k v mask=mask_u\wedge mask_v mask=maskumaskv. 设 u , v u,v u,v两点之间路径上各字符重排可以构成回文, 则 m a s k mask mask二进制表示最多有一位为1. 通过 d f s dfs dfs用哈希记录各点与根节点路径的字符奇偶状态 m a s k k mask_k maskk, 然后枚举哈希中的 m a s k i mask_i maski计算.文章来源地址https://www.toymoban.com/news/detail-607297.html

class Solution {
public:
    long long countPalindromePaths(vector<int> &parent, string s) {
        int n = parent.size();
        vector<pair<int, char>> sub[n];//邻接表
        for (int i = 1; i < n; i++)//建树
            sub[parent[i]].emplace_back(i, s[i]);
        unordered_map<int, int> cnt;//记录状态出现次数
        function<void(int, int)> dfs = [&](int cur, int mask) {
            cnt[mask]++;
            for (auto [j, ch]: sub[cur])
                dfs(j, mask ^ (1 << (ch - 'a')));
        };
        dfs(0, 0);
        long long res = 0;
        for (auto [mi, ci]: cnt) {
            if (ci > 1)//状态相同的情况
                res += 1LL * ci * (ci - 1);
            for (int j = 1; j < (1 << 26); j <<= 1)//枚举二进制只差一位的状态
                if (cnt.count(mi ^ j))
                    res += 1LL * ci * cnt[mi ^ j];
        }
        return res / 2;
    }
};

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

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

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

相关文章

  • LeetCode-763. 划分字母区间【贪心 哈希表 双指针 字符串】

    给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。 注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。 示例 1: 输入:s = “ababcbacadefegdehijhklij” 输

    2024年04月10日
    浏览(37)
  • LeetCode 138. Copy List with Random Pointer【链表,DFS,迭代,哈希表】中等

    本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,

    2024年02月09日
    浏览(30)
  • LeetCode 865. Smallest Subtree with all the Deepest Nodes【树,DFS,BFS,哈希表】1534

    本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,

    2024年02月09日
    浏览(31)
  • leetcode 355 设计推特

    用链表存储用户发送的每一个推特,用堆获取最先的10条动态

    2024年02月11日
    浏览(66)
  • leetcode系列贪心算法汇总

    11 盛水最多的容器 题目:给一个一维数组,大概的意思就是下标代表水槽的宽度,数组的值代表这个位置水槽的高度,求盛水最多的容量。 解析:肯定得有个临时变量来存最大值,且不断进行比较来更新最大值,然后分别从两边开始使用双指针进行遍历,tmp := (right - left)

    2024年02月07日
    浏览(35)
  • 【leetcode】贪心算法介绍

    详细且全面地分析贪心算法常用的解题套路、数据结构和代码逻辑如下: 找最值型: 每一步选择都是局部最优解,最后得到的结果就是全局最优解。 常用于找零钱问题、区间覆盖问题等。 一般情况下,可以通过排序将数据进行处理,然后逐步选择最优解。 区间问题: 将问

    2024年02月21日
    浏览(28)
  • 【贪心算法】leetcode刷题

    贪心算法无固定套路。 核心思想:先找局部最优,再扩展到全局最优。 两种思路: 1、从大到小。局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。 先遍历的胃口,在遍历的饼干 2、从小到大。 小饼干先喂饱小胃口 。两个

    2024年02月14日
    浏览(35)
  • 算法沉淀——贪心算法一(leetcode真题剖析)

    贪心算法(Greedy Algorithm)是一种基于贪心策略的优化算法,它通常用于求解最优化问题,每一步都选择当前状态下的最优解,以期望通过局部最优的选择最终达到全局最优。贪心算法的思想是在每一步都做出在当前状态下局部最优的选择,而不考虑未来可能造成的影响。 在

    2024年03月08日
    浏览(40)
  • 算法沉淀——贪心算法五(leetcode真题剖析)

    题目链接:https://leetcode.cn/problems/jump-game-ii/ 给定一个长度为 n 的 0 索引 整数数组 nums 。初始位置为 nums[0] 。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处: 0 = j = nums[i] i + j n 返回到达 nums[n - 1] 的最小跳跃次

    2024年04月11日
    浏览(43)
  • 算法沉淀——贪心算法七(leetcode真题剖析)

    题目链接:https://leetcode.cn/problems/integer-replacement/ 给定一个正整数 n ,你可以做如下操作: 如果 n 是偶数,则用 n / 2 替换 n 。 如果 n 是奇数,则可以用 n + 1 或 n - 1 替换 n 。 返回 n 变为 1 所需的 最小替换次数 。 示例 1: 示例 2: 示例 3: 提示: 1 = n = 2^31 - 1 思路 这里我们

    2024年03月23日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包