Leetcode 第 389 场周赛题解

Leetcode 第 389 场周赛题解

  • Leetcode 第 389 场周赛题解
    • 题目1:3083. 字符串及其反转中是否存在同一子字符串
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:3084. 统计以给定字符开头和结尾的子字符串总数
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:3085. 成为 K 特殊字符串需要删除的最少字符数
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:3086. 拾起 K 个 1 需要的最少行动次数
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 389 场周赛题解

题目1:3083. 字符串及其反转中是否存在同一子字符串

思路

代码

/*
 * @lc app=leetcode.cn id=3083 lang=cpp
 *
 * [3083] 字符串及其反转中是否存在同一子字符串
 */

// @lc code=start
class Solution
{
public:
    bool isSubstringPresent(string s)
    {
        int n = s.length();
        for (int i = 0; i < n - 1; i++)
        {
            string t1 = s.substr(i, 2);
            for (int j = n - 1; j > 0; j--)
            {
                string t2 = s.substr(j - 1, 2);
                reverse(t2.begin(), t2.end());
                if (t1 == t2)
                    return true;
            }
        }
        return false;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(n2),其中 n 是字符串 s 的长度。

空间复杂度:O(1)。

题目2:3084. 统计以给定字符开头和结尾的子字符串总数

思路

假设字符串 s 中有 count 个字符 c。

第一个字符 c 可以和后面 count-1 个 字符 c 组成以 c 字符开头和结尾的非空子字符串。

第二个字符 c 可以和后面 count-2 个 字符 c 组成以 c 字符开头和结尾的非空子字符串。

以此类推。

所以以 c 字符开头和结尾的非空子字符串的总数为 (count-1) + (count-2) + … + 1 = count * (count+1) / 2。

代码

/*
 * @lc app=leetcode.cn id=3084 lang=cpp
 *
 * [3084] 统计以给定字符开头和结尾的子字符串总数
 */

// @lc code=start
class Solution
{
public:
    long long countSubstrings(string s, char c)
    {
        long long count = 0;
        for (char &ch : s)
            if (ch == c)
                count++;
        // long long ans = 0;
        // for (int i = 1; i <= count; i++)
        //     ans += i;
        // return ans;
        return count * (count + 1) / 2;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(n),其中 n 是字符串 s 的长度。

空间复杂度:O(1)。

题目3:3085. 成为 K 特殊字符串需要删除的最少字符数

思路

类似于滑动窗口。

统计好字符的出现次数后,排序,遍历这个数组,假设当前值为 f,则频率的上界为 f+k。

统计频率为 [f, f+k] 的总字符个数,维护其最大值 max_save,那么最少删除个数就是字符串长度 word.length() - max_save。

代码

/*
 * @lc app=leetcode.cn id=3085 lang=cpp
 *
 * [3085] 成为 K 特殊字符串需要删除的最少字符数
 */

// @lc code=start
class Solution
{
public:
    int minimumDeletions(string word, int k)
    {
        unordered_map<char, int> mp;
        for (char &c : word)
            mp[c]++;
        vector<int> freq;
        for (auto &[ch, cnt] : mp)
            freq.push_back(cnt);
        sort(freq.begin(), freq.end());

        int min_del = INT_MAX;
        int front_sub = 0; // 前置差用来存储较小,并且需要减去的数
        for (int &f : freq)
        {
            int upper = f + k;
            int back_sub = 0; // 后置差用来存储后面较大数据需要减去的数
            for (int &j : freq)
                if (j > upper)
                    back_sub += j - upper;
            min_del = min(min_del, front_sub + back_sub);
            // 如果以后面一个大一点的数为最小值,此时前置差就得加上当前这个数
            front_sub += f;
        }
        return min_del;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(n+∣Σ∣),其中 n 是字符串 word 的长度,∣Σ∣ 为字符集合的大小,本题字符均为小写字母,所以 ∣Σ∣=26。

空间复杂度:O(∣Σ∣),其中 ∣Σ∣ 为字符集合的大小,本题字符均为小写字母,所以 ∣Σ∣=26。

题目4:3086. 拾起 K 个 1 需要的最少行动次数

思路

动作 1:在一个空位上生成一个 1。这个动作最多可以执行 maxChanges 次。
动作 2:把一个 1 移动到相邻的空位上。

动作 1 + 动作 2 = 在Alice相邻的空位上生成一个 1,再交换给Alice,花费为 2。

我们给Alice选初始位置时,最好选择 1 聚集的地方,具体来讲 1、1(Alice)、1 是比较好的。

在这里插入图片描述

这是一个货仓选址问题。

在这里插入图片描述

代码

/*
 * @lc app=leetcode.cn id=3086 lang=cpp
 *
 * [3086] 拾起 K 个 1 需要的最少行动次数
 */

// @lc code=start
class Solution
{
public:
    long long minimumMoves(vector<int> &nums, int k, int maxChanges)
    {
        vector<int> pos;
        int c = 0; // nums 中连续的 1 长度
        for (int i = 0; i < nums.size(); i++)
        {
            if (nums[i] == 0)
                continue;
            pos.push_back(i); // 记录 1 的位置
            c = max(c, 1);
            if (i > 0 && nums[i - 1] == 1)
            {
                if (i > 1 && nums[i - 2] == 1)
                { // 有 3 个连续的 1
                    c = 3;
                }
                else
                { // 有 2 个连续的 1
                    c = max(c, 2);
                }
            }
        }

        c = min(c, k);
        if (maxChanges >= k - c)
        {
            // 其余 k-c 个 1 可以全部用两次操作得到
            return max(c - 1, 0) + (k - c) * 2;
        }

        int n = pos.size();
        vector<long long> preSum(n + 1);
        for (int i = 0; i < n; i++)
            preSum[i + 1] = preSum[i] + pos[i];

        long long ans = LLONG_MAX;
        // 除了 maxChanges 个数可以用两次操作得到,其余的 1 只能一步步移动到 pos[i]
        int size = k - maxChanges;
        for (int right = size; right <= n; right++)
        {
            // s1+s2 是 j 在 [left, right) 中的所有 pos[j] 到 index=pos[(left+right)/2] 的距离之和
            int left = right - size;
            int i = left + size / 2;
            long long index = pos[i];
            long long s1 = index * (i - left) - (preSum[i] - preSum[left]);
            long long s2 = preSum[right] - preSum[i] - index * (right - i);
            ans = min(ans, s1 + s2);
        }
        return ans + maxChanges * 2;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(n),其中 n 是数组 nums 的长度。

空间复杂度:O(n),其中 n 是数组 nums 的长度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/521758.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Fire Smoke - Dynamic Nature

烟雾、火灾和爆炸预制件、着色器的集合。粒子支持HD、URP和标准渲染,自然制造风,因此它们对风速、方向和颤抖做出反应。 包装支持: Unity 2021.2及更高版本 Unity 2021.2 HD RP Unity 2021.2 URP Unity 2021.3及更高版本 Unity 2021.3 LTS HD RP Unity 2021.3 LTS URP Unity…

202112青少年软件编程(Scratch图形化)等级考试试卷(四级)

第1题&#xff1a;【 单选题】 小猫和小狗是非常好的朋友&#xff0c; 他们发明了一种加密方法&#xff1a; 用两位数字代表字母。比如 65 代表 A&#xff0c; 66 代表 B……&#xff0c; 75 代表 K&#xff0c; ……&#xff0c; 78 代表 N&#xff0c; 79 代表 O、 80 代表 …

zdpdjango_argonadmin使用Django开发一个美观的后台管理系统

初始代码 安装依赖 pip install -r requirements.txt生成管理员账户 迁移模型&#xff1a; python manage.py makemigrations python manage.py migrate创建超级用户&#xff1a; python manage.py createsuperuser启动服务 python manage.py runserver浏览器访问&#xf…

ChatGPT官宣新增Dynamic(动态)模式!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

Java中IO流详解

文章目录 字符流问题导入编码表**出现乱码的原因**ASCII表Unicode表汉字存储和展示过程解析问题导入解答 介绍分类字符输出流字符输入流字符缓冲流 特殊操作流转化流对象操作流打印流 工具包Commons-io介绍分类IOUtils类FileUtils类 字符流 问题导入 既然字节流能操作所有文件…

探索Linux的挂载操作

在Linux这个强大的操作系统中&#xff0c;挂载操作是一个基本而重要的概念。它涉及到文件系统、设备和数据访问&#xff0c;对于理解Linux的工作方式至关重要。那么&#xff0c;挂载操作究竟是什么&#xff0c;为什么我们需要它&#xff0c;如果没有它&#xff0c;我们将面临什…

递归学习第一个课

一、递归定义 基本定义 函数自己调用自己&#xff08;通俗第一印象&#xff09;大问题可以拆分小问题&#xff08;拆分&#xff0c;边界&#xff09;大问题与小问题的关系&#xff08;递归关系&#xff09; 为什么拆分小问题&#xff1f; 小问题更容易求解大问题与小问题内部…

基于Spark中随机森林模型的天气预测系统

基于Spark中随机森林模型的天气预测系统 在这篇文章中&#xff0c;我们将探讨如何使用Apache Spark和随机森林算法来构建一个天气预测系统。该系统将利用历史天气数据&#xff0c;通过机器学习模型预测未来的天气情况&#xff0c;特别是针对是否下雨的二元分类问题。 简介 Ap…

SpringBoot3整合RabbitMQ之四_发布订阅模型中的fanout模型

SpringBoot3整合RabbitMQ之四_发布订阅模型中的fanout模型 文章目录 SpringBoot3整合RabbitMQ之四_发布订阅模型中的fanout模型3. 发布/订阅模型之fanout模型1. 说明1. 消息发布者1. 创建工作队列的配置类2. 发布消费Controller 2. 消息消费者One3. 消息消费者Two4. 消息消费者…

实际项目中如何使用Git做分支管理

前言 Git是一种强大的分布式版本控制系统&#xff0c;在实际项目开发中使用Git进行分支管理是非常常见的做法&#xff0c;因为它可以帮助团队高效的协作和管理项目的不同版本&#xff0c;今天我们来讲讲在实际项目中最常用的Git分支管理策略Git Flow。 常见的Git分支管理策略…

IDEA2024.1版本震撼来袭,手把手教你激活!

前言 作为一个Java程序猿&#xff0c;必不可少的一款开发IDE神器&#xff1a;IntelliJ IDEA&#xff0c;简称“IDEA”。就在前天&#xff08;2024.4.4&#xff09;终于推出了心心念念的2024.1版本。 IntelliJ IDEA 2024.1 引入了一系列令人期待的升级&#xff0c;可以帮助您简…

Nuxt 3 项目中配置 Tailwind CSS

官方文档&#xff1a;https://www.tailwindcss.cn/docs/guides/nuxtjs#standard 安装 Tailwind CSS 及其相关依赖 执行如下命令&#xff0c;在 Nuxt 项目中安装 Tailwind CSS 及其相关依赖 npm install -D tailwindcss postcss autoprefixerpnpm install -D tailwindcss post…

深度剖析扫雷游戏的各个知识点(1)

哈喽&#xff0c;小伙伴&#xff0c;大家好&#xff0c;今天我来水一篇文章。害&#xff0c;也不算真的水吧&#xff0c;这次带大家深度剖析初次写扫雷游戏程序时还未接触到的知识点。废话不多说&#xff0c;直接进入正题 不知小伙伴们是否还记得当时我说过扫雷游戏我们是以多个…

AIGC实战——ProGAN(Progressive Growing Generative Adversarial Network)

AIGC实战——ProGAN 0. 前言1. ProGAN2. 渐进式训练3. 其他技术3.1 小批标准差3.2 均等学习率3.3 逐像素归一化 4. 图像生成小结系列链接 0. 前言 我们已经学习了使用生成对抗网络 (Generative Adversarial Network, GAN) 解决各种图像生成任务。GAN 的模型架构和训练过程具有…

2023 年网络安全热点技术发展态势

文章目录 前言一、人工智能信息技术迎来井喷式发展期二、零信任网络安全架构即将投入实际部署三、美国全面推动军政业务向云环境迁移四、专用太空软硬件与独立卫星网络并行发展五、量子信息技术与网络安全领域加速融合前言 在 2023 年取得进展的信息技术不在少数。从网络安全的…

从300亿分子中筛出6款,结构新且易合成,斯坦福抗生素设计AI模型登Nature子刊

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 全球每年有近 500 万人死于抗生素耐药性&#xff0c;因此迫切需要新的方法来对抗耐药菌株。 …

HTML5.Canvas简介

1. Canvas.getContext getContext(“2d”)是Canvas元素的方法&#xff0c;用于获取一个用于绘制2D图形的绘图上下文对象。在给定的代码中&#xff0c;首先通过getElementById方法获取id为"myCanvas"的Canvas元素&#xff0c;然后使用getContext(“2d”)方法获取该Ca…

音视频开发之旅(83)- 腾讯音乐开源高质量唇形同步模型--MuseTalk

目录 1.效果展示 2.原理学习 3.流程分析 4.资料 一、效果展示 -- &#xff08;推理素材来源于网络&#xff0c;如有侵权&#xff0c;联系立删&#xff01;&#xff09; 唱歌效果&#xff08;歌曲有suno生成&#xff09; 用于推理的视频素材来源于网络&#xff0c;如有侵权&…

Java中常见的排序算法

常见算法可以分为两大类&#xff1a;   非线性时间比较类排序&#xff1a;通过比较来决定元素间的相对次序&#xff0c;由于其时间复杂度不能突破O(nlogn)&#xff0c;因此称为非线性时间比较类排序。   线性时间非比较类排序&#xff1a;不通过比较来决定元素间的相对次序…

Windows应急响应

1.排查隐藏账号 查看注册表 找到攻击者用户目录文件 排查用户异常 eventvwr.msc 分析用户登录日志 排查可疑端口 排查可疑进程 检查启动项、计划任务和服务 查看系统补丁信息 安装火绒&#xff0c;在安全工具里有火绒剑 计划任务 使用D盾对主机进行检测&#xff0c;发现隐藏账户…