当前位置: 首页 > news >正文

LeetCode ---400周赛

题目列表

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个1ans = min(ans,abs(nums[j]-k));}}return ans;}
};

相关文章:

  • 在npm发布自己的组件包
  • 编程规范-代码检测-格式化-规范化提交
  • 安徽京准NTP时钟系统:GPS北斗卫星授时下的生活重塑
  • 2559. 统计范围内的元音字符串数(前缀和) o(n)时间复杂度
  • k-means聚类模型的优缺点
  • 后端 excel的导入
  • 探索k8s集群的配置资源(secret和configmap)
  • 自然语言处理(NLP)—— 主题建模
  • WMS仓储管理系统高效驱动制造企业物料管理
  • dart 基本语法
  • 【Python】认识 Python
  • 【设计模式之外观模式 -- C++】
  • 【数据结构】栈和队列-->理解和实现(赋源码)
  • width: 100%和 width: 100vw这两种写法有什么区别
  • 大模型参加高考,同写2024年高考作文,及格分(通义千问、Kimi、智谱清言、Gemini Advanced、Claude-3-Sonnet、GPT-4o)
  • es6要点
  • java概述
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • 闭包,sync使用细节
  • 搭建gitbook 和 访问权限认证
  • 分享几个不错的工具
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前言-如何学习区块链
  • 什么是Javascript函数节流?
  • 微信小程序设置上一页数据
  •  一套莫尔斯电报听写、翻译系统
  • 怎么把视频里的音乐提取出来
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • #HarmonyOS:Web组件的使用
  • #单片机(TB6600驱动42步进电机)
  • #预处理和函数的对比以及条件编译
  • (06)金属布线——为半导体注入生命的连接
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (6)设计一个TimeMap
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (一)插入排序
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • .chm格式文件如何阅读
  • .DFS.
  • .net 反编译_.net反编译的相关问题
  • .Net 应用中使用dot trace进行性能诊断
  • .Net 执行Linux下多行shell命令方法
  • .net 中viewstate的原理和使用
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET基础篇——反射的奥妙
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • @Resource和@Autowired的区别
  • [10] CUDA程序性能的提升 与 流