Leetcode 第 372 场周赛题解

Leetcode 第 372 场周赛题解

  • Leetcode 第 372 场周赛题解
    • 题目1:2937. 使三个字符串相等
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:2938. 区分黑球与白球
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:2939. 最大异或乘积
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:2940. 找到 Alice 和 Bob 可以相遇的建筑
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 372 场周赛题解

题目1:2937. 使三个字符串相等

思路

枚举。

设 len1、len2、len3 分别为字符串 s1、s2、s3 的长度。

min_len 是 3 个字符串长度的最小值。

枚举 len = min_len 到 len = 1,设 t1、t2、t3 分别是字符串 s1、s2、s3 的从 0 开始、长度为 len 的子串。

如果 t1 == t2 == t3,说明可以通过操作(选择其中一个长度至少为 2 的字符串并删除其最右位置上的字符)使这三个字符串相等,最小操作次数 = len1 + len2 + len3 - 3 * len。

否则,返回 -1。

代码

/*
 * @lc app=leetcode.cn id=2937 lang=cpp
 *
 * [2937] 使三个字符串相等
 */

// @lc code=start
class Solution
{
public:
    int findMinimumOperations(string s1, string s2, string s3)
    {
        int len1 = s1.length(), len2 = s2.length(), len3 = s3.length();
        int min_len = min(len1, min(len2, len3));
        for (int len = min_len; len >= 1; len--)
        {
            string t1 = s1.substr(0, len), t2 = s2.substr(0, len), t3 = s3.substr(0, len);
            if (t1 == t2 && t2 == t3)
                return len1 + len2 + len3 - 3 * len;
        }
        return -1;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(min_len),其中 min_len 为三个字符串中的最短字符串的长度。

空间复杂度:O(1)。

题目2:2938. 区分黑球与白球

思路

贪心。

类似于冒泡排序的思想,把 ‘0’ 挪到相应的位置。

一次遍历,累加操作次数。

示例:

在这里插入图片描述

代码

/*
 * @lc app=leetcode.cn id=2938 lang=cpp
 *
 * [2938] 区分黑球与白球
 */

// @lc code=start
class Solution
{
public:
    long long minimumSteps(string s)
    {
        int white = 0;
        long long steps = 0;
        for (int i = 0; i < s.length(); i++)
        {
            if (s[i] == '0')
            {
                steps += (long long)(i - white);
                white++;
            }
        }
        return steps;
    }
};
// @lc code=end

另解:操作次数 = Σ(每个 ‘0’ 左边的 ‘1’ 的个数)。

代码:

/*
 * @lc app=leetcode.cn id=2938 lang=cpp
 *
 * [2938] 区分黑球与白球
 */

// @lc code=start
// class Solution
// {
// public:
//     long long minimumSteps(string s)
//     {
//         int white = 0;
//         long long steps = 0;
//         for (int i = 0; i < s.length(); i++)
//         {
//             if (s[i] == '0')
//             {
//                 steps += (long long)(i - white);
//                 white++;
//             }
//         }
//         return steps;
//     }
// };

class Solution
{
public:
    long long minimumSteps(string s)
    {
        int black = 0;
        long long steps = 0;
        for (int i = 0; i < s.length(); i++)
        {
            if (s[i] == '0')
                steps += black;
            else
                black++;
        }
        return steps;
    }
};
// @lc code=end

复杂度分析

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

空间复杂度:O(1)。

题目3:2939. 最大异或乘积

思路

位运算。

题解:O(1) 做法!位运算的巧妙运用!(Python/Java/C++/Go)

代码

/*
 * @lc app=leetcode.cn id=2939 lang=cpp
 *
 * [2939] 最大异或乘积
 */

// @lc code=start
class Solution
{
public:
    int maximumXorProduct(long long a, long long b, int n)
    {
        if (a < b)
        {
            swap(a, b); // 保证 a >= b
        }

        long long mask = (1LL << n) - 1;
        long long ax = a & ~mask; // 第 n 位及其左边,无法被 x 影响,先算出来
        long long bx = b & ~mask;
        a &= mask; // 低于第 n 位,能被 x 影响
        b &= mask;

        long long left = a ^ b;      // 可分配:a XOR x 和 b XOR x 一个是 1 另一个是 0
        long long one = mask ^ left; // 无需分配:a XOR x 和 b XOR x 均为 1
        ax |= one;                   // 先加到异或结果中
        bx |= one;

        // 现在要把 left 分配到 ax 和 bx 中
        // 根据基本不等式(均值定理),分配后应当使 ax 和 bx 尽量接近,乘积才能尽量大
        if (left > 0 && ax == bx)
        {
            // 尽量均匀分配,例如把 1111 分成 1000 和 0111
            long long high_bit = 1LL << (63 - __builtin_clzll(left));
            ax |= high_bit;
            left ^= high_bit;
        }
        // 如果 a & ~mask 更大,则应当全部分给 bx(注意最上面保证了 a>=b)
        bx |= left;

        const long long MOD = 1'000'000'007;
        return ax % MOD * (bx % MOD) % MOD; // 注意不能直接 LL * LL,否则溢出
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(1)。

空间复杂度:O(1)。

题目4:2940. 找到 Alice 和 Bob 可以相遇的建筑

思路

题解:两种方法:离线+最小堆/在线+线段树二分(Python/Java/C++/Go)

代码

class Solution {
public:
    vector<int> leftmostBuildingQueries(vector<int> &heights, vector<vector<int>> &queries) {
        vector<int> ans(queries.size(), -1);
        vector<vector<pair<int, int>>> left(heights.size());
        for (int qi = 0; qi < queries.size(); qi++) {
            int i = queries[qi][0], j = queries[qi][1];
            if (i > j) {
                swap(i, j); // 保证 i <= j
            }
            if (i == j || heights[i] < heights[j]) {
                ans[qi] = j; // i 直接跳到 j
            } else {
                left[j].emplace_back(heights[i], qi); // 离线
            }
        }

        priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
        for (int i = 0; i < heights.size(); i++) { // 从小到大枚举下标 i
            while (!pq.empty() && pq.top().first < heights[i]) {
                ans[pq.top().second] = i; // 可以跳到 i(此时 i 是最小的)
                pq.pop();
            }
            for (auto &p: left[i]) {
                pq.emplace(p); // 后面再回答
            }
        }
        return ans;
    }
};

复杂度分析

时间复杂度:O(n+qlog⁡q),其中 n 为 heights 的长度,q 为 queries 的长度。
空间复杂度:O(n+q)。

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

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

相关文章

演示命令执行漏洞无回现如何渗透

演示命令执行漏洞无回现如何渗透 在DNSlog 获取一个域名 使用dvwa中的命令执行来ping此域名 执行后在DNSlog收到解析&#xff0c;证明命令执行成功

VSCode任务tasks.json中的问题匹配器problemMatcher的问题匹配模式ProblemPattern详解

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、简介 在 VS Code 中&#xff0c;tasks.json 文件中的 problemMatcher 字段用于定义如何解析任务输出中的问题&#xff08;错误、警告等&#xff09;。 problemMatcher有三种配置方式&#xff0c;具体可…

欧科云链研究院:从香港SFC最新文件看链上交易合规必备之选

出品&#xff5c;欧科云链研究院 作者&#xff5c;Hedy Bi 近日&#xff0c;香港证监会在其官网发布“致持牌法团、获证监会发牌的虚拟资产服务提供者及有联系实体的通函 - 打击洗钱&#xff0f;恐怖分子资金筹集经更新的《打击洗钱&#xff0f;恐怖分子资金筹集的自我评估查…

图形学 -- Ray Tracing 光线追踪

参考视频&#xff1a;Lecture 13 Ray Tracing 1_哔哩哔哩_bilibili Ray tracing 原因 Rasterization 格栅话不能处理好global effects&#xff0c;如↓ 简介反射&#xff1a;光线在到达人眼前不止弹射一次 基本假设 1&#xff09;光是沿着直线传播 2&#xff09;光线交叉…

2023年山东省安全员B证证模拟考试题库及山东省安全员B证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年山东省安全员B证证模拟考试题库及山东省安全员B证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;山东省安全员B证证模拟考试题库是根据山东省安全员B证最新版教材&#xff0c;山东省安全员B证大纲整理…

CMap数据库筛选化学药物

数据库clue.io 文献链接&#xff1a;连接图谱&#xff1a;使用基因表达特征连接小分子、基因和疾病 |科学 (science.org) 基本模式&#xff1a;利用CMap将差异基因列表与数据库参考数据集比对&#xff1b;根据差异表达基因在参考基因表达谱富集情况得到一个相关性分数&#…

YOLOv7训练:_pickle.UnpicklingError: STACK_GLOBAL requires str

在YOLOv7训练过程中&#xff0c;出现以下错误&#xff1a; 原因就是&#xff1a; 这个数据集在其他地方运行过产生了**.cache**文件 解决方案&#xff08;亲测有效&#xff09;&#xff1a; 删除数据集中的所有 label.cache文件&#xff0c;比如训练集、验证集、测试集都删…

SpingBoot原理

目录 配置优先级Bean管理 (掌握)Bean的获取 ApplicationContext.getBeanBean的作用域 Scope("prototype") Lazy第三方Bean Bean Configuration SpringBoot底层原理 起步依赖与自动配置(无需手撸但面试高频知识点)自动配置引入第三方依赖常见方案方案1&#xff1a;Com…

hook io异常注入

文中code https://gitee.com/bbjg001/darcy_common/tree/master/io_hook 需求引入 最近工作需要&#xff0c;需要验证一下我们的服务在硬盘故障下的鲁棒性。 从同事大佬哪里了解到hook技术&#xff0c;可以通过LD_PRELOAD这个环境变量拦截依赖库的调用链&#xff0c;将对标准…

PowerShell无人参与安装最新版本SQL Server Management Studio (SSMS)

文章目录 下载SQL Server Management Studio (SSMS)Power Shell实现无人安装推荐阅读 下载SQL Server Management Studio (SSMS) SSMS 19.2 是最新的正式发布 (GA) 版本。 如果已经安装了 SSMS 19 预览版&#xff0c;需要在安装 SSMS 19.2 之前将其卸载。 如果安装了 SSMS 19.…

【Java】多线程-单例模式/volatile-指令重排序

单例模式即代码中只有一个实例的模式 适用场景&#xff1a;有些场景下&#xff0c;有的类只能有一个对象&#xff0c;不能有多个 要注意&#xff1a;在单例模式下&#xff0c;要保证不能产生多个实例 1、饿汉模式 class Singleton{private static Singleton instance new …

人员定位系统人员聚集风险监测预警功能为企业安全生产保驾护航!

危化企业生产区域由于装置设施开停工、设备检维修或其它原因&#xff0c;会导致在局部作业区域出现作业操作人员、指挥管理人员不定时、不定点的聚集情况&#xff0c;一旦发生泄漏中毒、火灾爆炸、高温高热物质喷溅等事故&#xff0c;人员聚集将会在一定程度上加重事故后果的严…

【Echart】Echart设置label太长隐藏:

文章目录 第一种&#xff1a;竖排显示第二种&#xff1a;显示部分第三种&#xff1a;强制显示所有标签并旋转 第一种&#xff1a;竖排显示 xAxis: {type: category,data: res.data.data.sz.xAxis,axisLabel:{fontSize:12,formatter: function(value) {return value.split().joi…

nginx基础组件的使用

文章目录 一、Nginx 的相关组件介绍1.1、ngx_palloc相关源码1.2、ngx_array组件的相关源码1.3、ngx_array的数据结构1.4、ngx_cycle简介和相关源码1.5、ngx_list相关源码1.6、ngx_list 的数据结构 二、Nginx 组件的使用2.1、makefile的编写2.2、ngx_pallocngx_array的使用2.3、…

【代码随想录】刷题笔记Day33

前言 Day33虽说是一个月&#xff0c;但是从第一篇开始实际上已经过了8个月了&#xff0c;得抓紧啊 46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 前面组合就强调过差别了&#xff0c;这道题是排序&#xff0c;因此每次要从头到尾扫&#xff0c;结合used数组 class So…

ky10 server aarch64 离线安装openssl3.1.4

离线程序 https://gitcode.net/zengliguang/ky10_aarch64_openssl_install.git 输入下面命令执行离线安装脚本 source openssl_offline_install.sh 安装完成

对比学习15篇顶会论文及代码合集,2023最新

对比学习&#xff08;contrastive learning&#xff09;是现在无监督学习中一种常用的学习机制&#xff0c;它可以在没有标签的数据上进行学习&#xff0c;避免依赖大量标签数据&#xff0c;从而帮助我们更好地理解和利用数据集中的信息&#xff0c;提高模型的性能和表现。 作…

做医疗影像心脏方面的看过来:医学图像重建的心脏 MRI 数据集

本文发布了CMRxRecon数据集&#xff0c;包括来自 300 名受试者的多对比度、多视图、多切片和多通道 CMR 成像数据&#xff0c;还由经验丰富的放射科医生提供了所有受试者的心肌和心室的手动分割。单位&#xff1a;复旦, 香港理工大学, 厦大等 心脏磁共振成像&#xff08;CMR&a…