LeetCode ---400周赛

news2024/11/26 22:45:53

题目列表

3168. 候诊室中的最少椅子数

3169. 无需开会的工作日

3170. 删除星号以后字典序最小的字符串

3171. 找到按位与最接近 K 的子数组

一、候诊室中的最少椅子数

简单的模拟题,我们可以这样来模拟:当有顾客来时,我们加一把椅子,当有顾客走时,我们减少一把椅子,这样我们就i能动态的获得所有时刻需要的椅子数量,取最大值即可,代码如下

class Solution {
public:
    int minimumChairs(string s) {
        int ans = 0, cnt = 0;
        for(auto e:s){
            if(e == 'E') cnt++;
            else cnt--;
            ans = max(ans, cnt);
        }
        return ans;
    }
};

二、无需开会的工作日

这里有两种思路:1、直接算放假天数,2、先算开会天数,再用总数减去上班天数得到放假天数,这两种方法都可以,代码如下

// 方法一:直接算放假天数
class Solution {
public:
    int countDays(int days, vector<vector<int>>& meetings) {
        int n = meetings.size();
        sort(meetings.begin(),meetings.end());
        int ans = 0, end = 0;
        for(int i = 0; i < n; i++){
            if(meetings[i][0]>end) ans += meetings[i][0] - end - 1;
            end = max(end, meetings[i][1]);
        }
        if(end < days) ans += days - end;
        return ans;
    }
};

// 方法二:先算开会天数,再得出放假天数
class Solution {
public:
    int countDays(int days, vector<vector<int>>& meetings) {
        int n = meetings.size();
        sort(meetings.begin(),meetings.end());
        int ans = 0, end = meetings[0][1];
        for(int i = 0; i < n;){
            int j = i++;
            while(i<n && end>=meetings[i][0]-1){
                end = max(end, meetings[i][1]);
                i++;
            }
            ans += end - meetings[j][0] + 1;
            if(i < n) end = max(end, meetings[i][1]);
        }
        return days - ans;
    }
};

三、删除信号以后字典序最小的字符串

题目要求在删除*的同时,删除字典序最小的字符。故这题的关键就在于该如何选择和*一起删除的最小字符?这里先输出结论:删除距离*最近的最小字符得到的字符串最大。为什么呢?

1、假设最小的字符的前后字符都比它大,如cbacbacba中的a,这时,我们无论删除哪一个a都会让字符串的字典序变大,但是删除最右边的a得到的字典序最小(这是由字典序的定义决定的,越靠前的字符的权重越大,因为我们优先比较前面的字符,可以用数字来理解,比如151515,我们肯定选择将最后一个1去掉,这样得到的数字最大,因为它的权重小在十位) => 优先选择靠右的最小字符进行删除。

2、如果有只有一段连续的最小字符呢?如aaaaaaaaab,这时,我们无论删除哪一个a,产生的字符串字典序都相同。如果有多段连续的最小字符呢?如abaabaaab,显然,我们应该优先选择右边的最小字符连续段进行删除操作。

在兼顾1的情况下,我们得出结论:优先选择最靠右的最小字符进行删除,即删除距离*最近的最小字符

代码如下

class Solution {
public:
    string clearStars(string s) {
        int n = s.size();
        vector<vector<int>> pos(26);
        for(int i = 0; i < n; i++){
            if(isalpha(s[i])) {
                pos[s[i]-'a'].emplace_back(i); // 记录字符的位置
            }else{
                for(auto& v:pos){
                    if(v.size()){
                        s[v.back()] = '*'; // 将要删除的最小字符置为*
                        v.pop_back(); // 从记录中删除
                        break;
                    }
                }
            }
        }
        s.erase(remove(s.begin(),s.end(),'*'),s.end()); // 删除字符串中的*,O(n)
        return s;
    }
};

四、找到按位与最接近k的子数组

这题考的是&运算的性质:参与&的数字越多,结果越小 --- 具有单调性。在结合题目中要求子数组&的结果,其实就可以用滑动窗口来做,思路如下

假设[ L,R ] 的子数组&结果为res

  • 如果res>k,我们让res继续和后面的数进行&,因为res可以变的更小,即可能更加靠近k
  • 如果res=k,可以直接返回0
  • 如果res<k,由于&的数子越多,res越小,我们需要将左端点向右移,减少区间内的数字,让res变大,才可能更靠近k

所以问题的难点在于如何在移动左端点的同时,维护res?我们可以统计区间中的数字的二进制位0的出现次数,代码如下

class Solution {
public:
    int minimumDifference(vector<int>& nums, int k) {
        int n = nums.size();
        int ans = INT_MAX;
        int cnt0[32]{};
        int res = -1; // -1的二进制为全1,不影响&结果
        for(int l = 0, r = 0; r < n; r++){
            // 进窗口
            res &= nums[r];
            // 统计0的出现次数
            for(int i = 0; i < 32; i++)
                if((nums[r]>>i&1)==0)
                    cnt0[i]++;
            // 出窗口
            while(l < r && res <= k){ // 这里注意 l < r必须要写,因为 当l > r时,res会一直等于-1,会死循环
                if(res == k) return 0;
                ans = min(abs(k-res), ans); // 注意在<k或者>k的情况下都要更新答案
                for(int i = 0; i < 32; i++){
                    if((nums[l]>>i&1)==0)
                        if(--cnt0[i]==0)
                            res |= (1<<i);
                }
                l++;
            }
            ans = min(abs(k-res), ans); // 注意在<k或者>k的情况下都要更新答案
        }
        return ans;
    }
};

当然这种位运算的题,其实还有另一种通解,简单来说就是暴力枚举所有可能的&结果(可以优化),代码如下

// O(nlogU) U = max(nums) ,在这里可以认为是O(n)的时间复杂度
class Solution {
public:
    int minimumDifference(vector<int>& nums, int k) {
        int n = nums.size();
        int ans = INT_MAX;
        for(int i = 0; i < n; i++){
            int x = nums[i];
            ans = min(ans, abs(x-k));
            // 注意这里的限制条件
            // 因为&只能让数字变小,所以一旦[j,i]区间内的数字&结果和原先相同,则nums[i]将无法更新前面的&结果
            for(int j = i - 1; j>=0 && (nums[j]&x)!=nums[j]; j--){
                nums[j] &= x; // nums[j] 只能变小30次,因为题目范围内的数字二进制最多有30个1
                ans = min(ans,abs(nums[j]-k));
            }
        }
        return ans;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java并发控制(猴子摘桃例子)

【问题】 有n个桃子&#xff0c; 猴子A每次固定摘2个&#xff0c;猴子B每次固定摘3个&#xff0c;这2只猴子不断摘桃子直到剩余桃子数量不足以摘&#xff08;必须满足摘桃个数&#xff09;&#xff1b; 【1】 使用AtomicInteger&#xff08;推荐&#xff09; 1&#xff09;利…

11 深入理解Linux文件系统与日志分析

目录 11.1 深入理解Linux文件系统 11.1.1 inode与block详解 1. inode和block概述 2. inode的内容 3. inode的号码 4. inode的大小 11.1.2 硬链接与软连接 1. 硬链接 2. 软连接 11.1.3 EXT类型文件恢复 1. 编译安装extundelete 2. 模拟删除并执行恢复操作 11.1.4 xfs类型文件备…

【Centos】深度解析:CentOS下安装pip的完整指南

【Centos】深度解析&#xff1a;CentOS下安装pip的完整指南 大家好 我是寸铁&#x1f44a; 总结了一篇【Centos】深度解析&#xff1a;CentOS下安装pip的完整指南✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 方式1(推荐) 下载get-pip.py到本地 sudo wget https://bootstrap.p…

用python编撰一个电脑清理程序

自制一个电脑清理程序&#xff0c;有啥用呢&#xff1f;在电脑不装有清理软件的时候&#xff0c;可以解决自己电脑内存不足的情况。 1、设想需要删除指定文件夹中的临时文件和缓存文件。以下是代码。 import os import shutil def clean_folder(folder_path): for root,…

CleanMyMac X 4.15.4破解版含2024最新CleanMyMac激活码

CleanMyMac X 4.15.4 for Mac 2023最新中文激活版是一款mac电脑清理工具&#xff0c;可让您快速轻松地个性化您的 Mac 操作系统。此外&#xff0c;它提高了系统速度和性能&#xff0c;帮助你远离黑客和垃圾文件。该程序具有尖端工具和功能&#xff0c;能够清除Mac系统中的任何故…

利用SuperGlue算法实现跨尺度金字塔特征点的高效匹配(含py代码)

在计算机视觉领域&#xff0c;特征点匹配是一个基础而关键的任务&#xff0c;广泛应用于图像拼接、三维重建、目标跟踪等方向。传统的特征点匹配方法通常基于相同尺度下提取的特征进行匹配&#xff0c;然而在实际场景中&#xff0c;由于成像距离、分辨率等因素的差异&#xff0…

图像处理ASIC设计方法 笔记29 场景自适应校正算法

P152 7.2.3 场景自适应校正算法 (一)Scribner提出的神经网络非均匀性校正算法 非均匀性校正(Non-Uniformity Correction,简称NUC)算法是红外成像技术中非常重要的一个环节。它主要用于校正红外焦平面阵列(Infrared Focal Plane Arrays,简称IRFPA)中的固定模式噪声,以提…

《python程序语言设计》2018版第5章第46题均值和标准方差-下部(本来想和大家说抱歉,但成功了)

接上回&#xff0c;5.46题如何的标准方差 本来想和大家说非常抱歉各位同学们。我没有找到通过一个循环完成两个结果的代码。 但我逐步往下的写&#xff0c;我终于成功了&#xff01;&#xff01; 这是我大前天在单位找到的公式里。x上面带一横是平均值。 我不能用函数的办法…

高考后志愿填报信息采集系统制作指南

在高考的硝烟散去之后&#xff0c;每位学生都面临着一个重要的任务——志愿填报。老师们如何高效、准确地收集和整理这些信息&#xff0c;成为了一个棘手的问题。难道我们只能依赖传统的手工登记方式&#xff0c;忍受其繁琐和易错吗&#xff1f; 易查分是一个简单易用的在线工具…

基于GTX 8B10B编码的自定义PHY上板测试(高速收发器十四)

前文整理了GTX IP&#xff0c;完成了自定义PHY协议的收发模块设计&#xff0c;本文将通过光纤回环&#xff0c;对这些模块上板测试&#xff0c;首先需要编写一个用于生成测试数据的用户模块。 1、测试数据生成模块 本模块用于生成自定义PHY协议的测试数据&#xff0c;通过axi_…

XUbuntu24.04之ch9344(usb转串口芯片)安装驱动(二百四十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

DVB-S系统发射端Matlab仿真及FPGA实现

DVB标准 Digital Video Broadcasting&#xff08;数字视频广播&#xff09;是一个完整的数字电视解决方案&#xff0c;其中包括DVB-C&#xff08;数字电视有线传输标准&#xff09;&#xff0c; DVB-T&#xff08;数字电视地面传输标准&#xff09;&#xff0c;DVB-S&#xff…

什么是突发性耳聋?

72小时内突然发生、原因不明的感音神经性听力损失&#xff0c;至少在相邻的两个频率听力下降≥20dBHL。 特点&#xff1a; 1发生在数分钟、数小时或3天以内的听力下降&#xff1b; 2原因不明&#xff1b; 3多发生于单侧&#xff0c;可伴有耳鸣、耳堵塞感及耳周麻木感&#…

C#操作MySQL从入门到精通(21)——删除数据

前言: 谈到数据库,大家最容易脱口而出的就是增删改查,本文就是来详细介绍如何删除数据。 本文测试使用的数据库如下: 1、删除部分数据 使用delete 关键字,并且搭配where条件使用,否则会导致表中数据全部被删除 string sql = string.Empty;if (radioButton_DeletePart…

vivado HW_ILA

HW_ILA 描述 集成逻辑分析器&#xff08;ILA&#xff09;调试核心允许您执行系统内监控 通过对内核上的调试探针&#xff0c;在实现的设计中对信号进行处理。您可以配置 ILA核心实时触发特定硬件事件&#xff0c;并在 以系统速度探测。 ILA调试核心可以通过从IP目录实例化ILA核…

MyBatisPlus总结二

MybatisPlus总结一在这&#xff1a; MybatisPlus总结1/2-CSDN博客 六、分页查询&#xff1a; 6.1.介绍&#xff1a; MybatisPlus内置了分页插件&#xff0c;所以我们只需要配置一个分页拦截器就可以了&#xff0c;由于不同的数据库的分页的方式不一样&#xff0c;例如mysql和…

问题汇总:MPU6050(软件iic)

以下为个人问题汇总&#xff0c;排查点汇总可能大有缺陷&#xff0c;如有错误&#xff0c;欢迎指正。 排查点汇总 检查软件iic的时序操作用示波器或逻辑分析仪检查波形 无法使用逻辑分析仪进行I/O引脚波形分析 充当SDA、SCL的引脚要配置为推挽输出; 另外&#xff0c;逻辑分…

【全开源】安心护送非急救救护车转运平台小程序(FastAdmin+ThinkPHP+Uniap

&#x1f691;安心护送非急救救护车转运平台小程序——您的健康守护者&#x1f496; 安心护送转运平台小程序是一款基于FastAdminThinkPHPUniapp开发的非急救救护车租用转运平台小程序系统&#xff0c;可以根据运营者的业务提供类似短途接送救护服务&#xff0c;重症病人转运服…

一文学会Spring 实现事务,事务的隔离级别以及事务的传播机制

目录 一.Spring (Spring Boot) 实现事务 1.通过代码的方式手动实现事务 (手动档的车) 2.通过注解的方式实现声明式事务 (自动挡的车) 二.事务的4大特性(ACID) 三.事务的隔离级别 ①Mysql的事务隔离级别: ②Spring的事务隔离级别: 四.事务的传播机制 ①事务传播机制的概…

Git配置 安装及使用

团队开发的神 找工作必备 环境变量 配置好环境后 打开终端环境 winr cmd 我习惯在桌面打开&#xff0c;然后进入相应的文件夹 &#xff08;文件夹结构&#xff09; &#xff08;个人感觉能用cmd不用git&#xff0c;cmd更好用一些&#xff09; 进入对应的文件夹 填写自己对…