Leetcode - 周赛400

目录

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

二,3169. 无需开会的工作日

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

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


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

本题是一道模拟题,直接使用一个变量存储实时的人数,每次修改之后,与之前的最大值比较,得出答案。

代码如下: 

class Solution {
    public int minimumChairs(String s) {
        int cnt = 0, ans = 0;
        for(char ch : s.toCharArray()){
            if(ch == 'E'){
                cnt++;
            }else{
                cnt--;
            }
            ans = Math.max(ans, cnt);
        }
        return ans;
    }
}

二,3169. 无需开会的工作日

本题要求没有安排会议的天数,可以正难则反,使用总天数减去工作的天数;也可以直接累加休息的天数。两者意思相同,能理解那种就使用那种。

代码如下:

//正难则反 -> 使用总天数 - 工作天数
class Solution {
    public int countDays(int days, int[][] meetings) {
        Arrays.sort(meetings,(x,y)->x[0]-y[0]);
        int s = 1, e = 0;
        for(int[] x : meetings){
            if(x[0] > e){
                days -= e - s + 1;
                s = x[0];
            }
            e = Math.max(e, x[1]);
        }
        days -= e - s + 1;
        return days;
    }
}

//直接算 -> 累加休息的天数
class Solution {
    public int countDays(int days, int[][] meetings) {
        Arrays.sort(meetings,(x,y)->x[0]-y[0]);
        int ans = 0;
        int pre = 0;//前一段工作日的最后一天
        for(int[] x : meetings){
            ans += Math.max(0, x[0] - pre - 1);
            pre = Math.max(pre, x[1]);
        }
        return ans+days-pre;
    }
}

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

本题题意——每次遇到一个' * '字符,就要删去它本身及其前面字典序最小的字符,如果有多个,可以删除其中任意一个,求删除所有 ' * ' 字符后,剩余字符串的最小字符串。

在写本题之前,需要弄清楚一个问题,如果' * '前面有多个相同的最小字符,究竟要删除哪一个,才能使得剩余的字符串最小?例如:"aaba*",我们只有删除最后一个'a'才能使剩余字符串最小。

弄清上述问题后,就可以写代码了,我们可以使用一个堆来统计遇到 '*' 字符前,删除字符的优先级(如果字符不同,按字典序排序;如果字符相同,下标大的排在前面),再使用一个哈希表来统计删除的字符下标,最后再遍历一次字符串s,将保留下来的字符串起来,得到答案。

代码如下: 

class Solution {
    public String clearStars(String s) {
        char[] ch = s.toCharArray();
        PriorityQueue<int[]> que = new PriorityQueue<>((x, y) -> {
            if(x[0] == y[0]) return y[1] - x[1];//如果字符相同,下标大的排在前面
            return x[0] - y[0];//如果字符不同,按字典序排序
        });
        Set<Integer> set = new HashSet<>();
        for(int i=0; i<ch.length; i++){
            if(ch[i] != '*'){
                que.offer(new int[]{ch[i]-'a', i});
            }else{
                set.add(que.poll()[1]);//统计删除的字符
                set.add(i);
            }
        }
        StringBuilder res = new StringBuilder();
        for(int i=0; i<ch.length; i++){
            if(!set.contains(i)){
                res.append(ch[i]);
            }
        }
        return res.toString();
    }
}

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

1.位运算性质 + 数学

  • 该题如果暴力求解,它的时间复杂度为O(n^2),会超时,但是如果添加一个 if 判断,就可以将它的复杂度降为O(nlogU),画个图理解一下:

class Solution {
    //O(nlogU) U=max(nums)
    public int minimumDifference(int[] nums, int k) {
        int ans = Integer.MAX_VALUE;
        for(int i=0; i<nums.length; i++){
            int x = nums[i];
            ans = Math.min(ans, Math.abs(k - x));
            for(int j=i-1; j>=0; j--){
                if((nums[j]&x)==nums[j]) break;
                // nums[j] &= x 只会变小,而最多只有32位不一样
                // 所以时间复杂度最多就是O(32*n)
                nums[j] &= x;
                ans = Math.min(ans, Math.abs(k - nums[j]));
            }
        }
        return ans;
    }
}

2.滑动窗口

  • &的性质——&的数越多,&值越小,可以使用滑窗,假设and是【l,r】的&值,如果 and小于 k(再继续&的话,and会更小,abs(k-and)的值就会变大),所以要将 nums[l] 回退,l++。注意:要不断地更新ans的值。
class Solution {
    public int minimumDifference(int[] nums, int k) {
        int ans = Integer.MAX_VALUE;
        int[] cnt = new int[32];
        int and = -1;
        for(int l=0,r=0; r<nums.length; r++){
            and &= nums[r];
            for(int i=0; i<32; i++){
                cnt[i] += (nums[r]>>i)&1;
            }
            ans = Math.min(ans, Math.abs(k - and));
            while(l <= r && and < k){
                for(int i=0; i<32; i++){
                    cnt[i] -= (nums[l]>>i)&1;
                    if(cnt[i] == r-l){
                        and |= (1<<i);
                    }
                }
                l++;
                ans = Math.min(ans, Math.abs(k - and));
            }
        }
        return ans;
    }
}

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

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

相关文章

Bootstrap框架最新V5 快速入门直通

目录 Bootstrap - 前言 Bootstrap - 下载 Bootstrap - 使用 Bootstrap - 学习 Bootstrap - 栅格系统 Bootstrap - 全局样式 Bootstrap - 组件(Coponents) Bootstrap - 字体图标 Bootstrap - 前言 Bootstrap是由Twitter公司开发维护的前端UI框架&#xff0c;它提供了大量…

【YOLOv5/v7改进系列】引入Slimneck-GSConv

一、导言 GSConv旨在平衡模型的准确度与速度&#xff0c;针对自动驾驶车辆中目标检测任务设计。从类脑研究中得到的直观理解是&#xff0c;具有更多神经元的模型能够获得更强的非线性表达能力。但是&#xff0c;不容忽视的是生物大脑处理信息的强大能力和低能耗远远超过计算机…

【Linux】Linux项目自动化构建工具——make/Makefile

1.背景 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的 规则来指定&#xff0c;哪些文件需要先编译&#xff0c;哪些文件需…

前端框架前置知识之Node.js:fs模块、path模块、http模块、端口号介绍

什么是模块&#xff1f; 类似插件&#xff0c;封装了方法 / 属性 fs 模块- 读写文件 代码示例 // 1. 加载 fs 模块对象 const fs require(fs) // 2. 写入文件内容 fs.writeFile(./test.txt, hello, Node.js, (err) > {if (err) console.log(err) //若 err不为空&#xf…

Linux的网络配置

查看网络配置命令 一、查看所有活动的网络接口信息 ifconfig ifconfig 展示的是当前设备正在工作的网卡&#xff08;启动的设备&#xff09; ifconfig -a 展示所有的网络设备 ifconfig ens33 查看指定网卡设备 ifconfig ens33 down 关闭网卡 或者 ifdown ens33 &#xff0…

Java集合概述

分类 分为两大类&#xff1a;Collection接口类和Map接口类 这两个接口都继承自一个共同的接口&#xff1a;Iterable接口&#xff0c;意为可迭代的 Iterable接口当中有一个Iterator迭代器接口对象&#xff0c;作为接口的变量&#xff08;public static final修饰&#xff09;…

MySQL—约束—外键约束中删除和更新行为(基础)

一、引言 上一个博客讲解并演示给字段加外键约束&#xff0c;以及通过外键来保证数据的一致性和完整性。我们一旦为子表 emp 字段 dept_id 添加外键关联之后&#xff0c;再去删除父表的数据之后&#xff0c;判断当前父表的这条数据是否在子表关联关系。如果存在&#xff0c;则不…

11.6 归并排序

目录 11.6 归并排序 11.6.1 算法流程 11.6.2 算法特性 11.6.3 链表排序 11.6 归并排序 归并排序&#xff08;merge sort&#xff09;是一种基于分治策略的排序算法&#xff0c;包含图 11-10 所示的“划分”和“合并”阶段。 划分阶段&#xff1a;通过递归不断地…

vue前端实现页面禁止缩放 前端适配问题处理 前端项目多端适配解决方案

在前端项目中,如果一个系统页面可以缩放可能会导致多种异常情况,这些异常情况涉及到页面布局、元素尺寸、事件触发、响应式设计和用户体验等方面。 1.布局错乱:页面元素在缩放后可能会出现错位、重叠或部分隐藏的情况,导致页面布局混乱,影响用户对页面内容的理解和操作。这…

接口签名和postman预处理生成签名

nestjs后端代码 controller Get(md5hmacSHA1b64)postMd5hmacSHA1b64(Req() request: Request, Query() query) {// 获取GET请求参数const queryParamsMap new Map(Object.entries(query));return this.handleMd5hmacSHA1b64(queryParamsMap, request);}Post(md5hmacSHA1b64)U…

达梦数据库相关SQL及适配Mysql配置总结

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

ApiJson简单使用

前言 最近在正式迭代中插入了一个大屏演示项目&#xff0c;因为后端开发人员任务都安排满了&#xff0c;而演示项目逻辑比较简单&#xff0c;大多是直接查表就能搞定&#xff0c;所以只能想办法让前端直接和数据库交互&#xff0c;增加开发速度。在找工具时发现了ApiJson。尝试…

C语言学习之结构体

结构体&#xff1a; c语言---提供的一种方式&#xff0c;可以让用户自定义数据类型&#xff0c;用于处理复杂的数据类型。 struct 结构体名 { 成员表列 }; 构造一个结构体 结构体变量的引用: 方法: 结构体变量名.成员名 . 结构体成员运算符 //表示 从属关系 s.name //表…

MySQL-权限管理(二)

一 host中的含义 /usr/local/mysql/bin/mysql -pLXYlxy2:024.#8u} -S /data/mysql/tmp/mysqld.sock select user,host,authentication_string from mysql.user; %:主要允许从任何主机连接到MySQL服务器&#xff0c;即外部连接localhost: 代表只允许本地主机连接到MySQL服务器&…

SpringBoot——整合Servlet的三大组件:过滤器(Filter)

目录 过滤器 一、用过滤器检查用户是否登录 LoginFilter自定义过滤器 FilterConfig配置类 FilterController控制器 SpringbootFilterApplication启动类 二、用过滤器统计资源访问量 LoginFilter FilterController 在开发SpringBoot项目时&#xff0c;开发人员经常需…

使用Obfuscar 混淆WPF(Net6)程序

Obfuscar 是.Net 程序集的基本混淆器&#xff0c;它使用大量的重载将.Net程序集中的元数据&#xff08;方法&#xff0c;属性、事件、字段、类型和命名空间的名称&#xff09;重命名为最小集。详细使用方式参见&#xff1a;Obfuscar 在NetFramework框架进行的WPF程序的混淆比较…

乡村振兴的乡村旅游品质提升:提升乡村旅游服务质量,打造乡村旅游品牌,增强乡村旅游吸引力,打造具有旅游特色的美丽乡村

目录 一、引言 二、提升乡村旅游服务质量 1、完善基础设施建设 2、提升服务人员素质 3、规范服务流程 三、打造乡村旅游品牌 1、挖掘乡村文化特色 2、打造特色旅游产品 3、加强品牌宣传和推广 四、增强乡村旅游吸引力 1、创新旅游体验方式 2、打造旅游精品线路 3、…

【NOI】C++程序结构入门之循环结构二-for循环

文章目录 前言一、for循环1.导入2.语法3.使用场景4.条件控制5.小结 二、例题讲解问题&#xff1a;1264 - 4位反序数问题&#xff1a;1085 - 寻找雷劈数问题&#xff1a;1057 - 能被5整除且至少有一位数字是5的所有整数的个数问题&#xff1a;1392 - 回文偶数&#xff1f;问题&a…

Windows下设置pip代理(proxy)

使用场景 正常网络情况下我们安装如果比较多的python包时&#xff0c;会选择使用这种 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-hostpypi.tuna.tsinghua.edu.cn 国内的镜像来加快下载速度。 但是&#xff0c;当这台被限制上…

Python 图书馆管理系统(MySQL数据库) 有GUI界面 【含Python源码 MX_032期】

使用python3&#xff0c;PyQt5&#xff0c;MySQL数据库搭建 主要功能&#xff1a; 用户注册、登录、修改密码、用户管理存储图书信息、采购增加和淘汰删除功能、租借功能实现图书采购、淘汰、租借功能。实现查询图书信息、采购和淘汰、库存、和租借情况实现统计图书的采购、库…