Leetcode - 周赛386

目录

一,3046. 分割数组

二,3047. 求交集区域内的最大正方形面积

三,3048. 标记所有下标的最早秒数 I

四,3049. 标记所有下标的最早秒数 II


一,3046. 分割数组

将题目给的数组nums分成两个数组,且这两个数组中没有相同的元素,求是否存在这两个数组,即求nums数组中有没有一个元素的出现次数 > 2,如果大于2,说明不论怎么分配总有一个数组含有相同的元素,返回 false,否则返回 true

代码如下:

class Solution {public boolean isPossibleToSplit(int[] nums) {int mx = 0;Map<Integer,Integer> map = new HashMap<>();for(int x : nums){map.put(x, map.getOrDefault(x,0)+1);mx = Math.max(mx, map.get(x));}return mx <= 2;}
}

二,3047. 求交集区域内的最大正方形面积

本题求两个矩阵的交集区域中最大正方形的面积,关键在于求出相交区域的矩阵的长和高:

  • 左下角的横坐标(x轴):两个矩阵左下角最大的横坐标
  • 左下角的纵坐标(y轴):两个矩阵左下角最大的纵坐标
  • 右上角的横坐标(x轴):两个矩阵右上角最小的横坐标
  • 右上角的纵坐标(y轴):两个矩阵右上角最小的横坐标

代码如下:

class Solution {public long largestSquareArea(int[][] bottomLeft, int[][] topRight) {long ans = 0;int n = bottomLeft.length;for(int i=0; i<n; i++){int[] b1 = bottomLeft[i];int[] t1 = topRight[i];for(int j=i+1; j<n; j++){int[] b2 = bottomLeft[j];int[] t2 = topRight[j];int LMx = Math.min(t1[0], t2[0]);int LMn = Math.max(b1[0], b2[0]);int RMn = Math.max(b1[1], b2[1]);int RMx = Math.min(t1[1], t2[1]);int x = Math.min(LMx-LMn, RMx-RMn);if(x > 0)ans = Math.max(ans,(long)x*x);}}return ans;}
}

三,3048. 标记所有下标的最早秒数 I

二分 + 贪心

本题的题目可以转换成一个更加简单易懂的说法 —— 学校考试:

距离学期结束还有 m 天,要复习 n 门课程,第 i 门课程的复习时间是nums[i],并且每一门课程的考试时间是固定的,由changeIndices数组决定(changIndices[i] 表示可以在第 i 天考第 changIndices[i] 门课程),问要将 n 门课程复习完+考完(考试当天只能用来考试),最少要花费多少时间?

通过读题,会发现直接求答案是非常困难的,那么是否可以通过枚举最终所需的天数来判断它是否够用,如果够用,那么缩减天数,如果不够用,那么增加天数,想到这,自然就会想到二分答案,但是使用二分还有一个前提:要具有单调性,那么本题是否有单调性呢?当然是有的:给的时间越多,复习的时间越充裕,越能够通过考试。

二分是可以的,那么接下来就是判断二分的这个答案是否成立(即如何判断所给的天数是否充足),有两种思考方式,一种从前往后思考,一种从后往前思考,这里只讲第一种思路:

通过上面的分析,我们知道考试的时间越靠后,复习的时间就越多,就越能够通过考试,所以我们需要求出每一门课程的最后一天考试时间,从前往后遍历:

  • 如果第 i 天不是某一门课程的最后一天考试天数,那么我们将这一天存起来(即cnt++),cnt 用作之后考试课程的复习天数
  • 如果第 i 天是某一门课程的最后一天考试天数,那么先判断我们是否有足够的时间cnt去复习这门课程,如果有,cnt 减去需要复习的天数,如果没有返回 false
  • 遍历结束返回 true

画个图理解一下:

 代码如下:

class Solution {public int earliestSecondToMarkIndices(int[] nums, int[] changeIndices) {int n = nums.length;int m = changeIndices.length;int[] last_test = new int[n];int l = n, r = m;while(l <= r){int mid = (l + r) / 2;if(check(nums, changeIndices, last_test, mid)){r = mid - 1;}else{l = mid + 1;}}return r+1 > m ? -1 : r+1;}boolean check(int[] nums, int[] changeIndices, int[] last_test, int lastDay){Arrays.fill(last_test, -1);for(int i=0; i<lastDay; i++){//求每一门考试在规定时间(lastDay)内的最后的考试时间last_test[changeIndices[i]-1] = i;}for(int x : last_test){//在规定时间内没有该课程的考试机会if(x < 0) return false;}int cnt = 0;for(int i=0; i<lastDay; i++){int idx = changeIndices[i]-1;//第i天的可以考试的课程if(last_test[idx]==i){if(cnt < nums[idx])return false;cnt -= nums[idx];}else{cnt++;}}return true;}
}

简单讲一下后往前遍历的思路:和第一个思路一样,只不过这里是透支复习的时间,也就是先考试,复习的天数先欠着,之后再还。(个人认为第一种更好理解,这种看不懂也没事)

代码如下:

class Solution {public int earliestSecondToMarkIndices(int[] nums, int[] changeIndices) {int n = nums.length;int m = changeIndices.length;if (n > m) return -1;int[] done = new int[n]; // 避免反复创建和初始化数组int left = n - 1, right = m + 1;while (left + 1 < right) {int mid = (left + right) / 2;if (check(nums, changeIndices, done, mid)) {right = mid;} else {left = mid;}}return right > m ? -1 : right;}private boolean check(int[] nums, int[] changeIndices, int[] done, int mx) {int exam = nums.length;int study = 0;for (int i = mx - 1; i >= 0 && study <= i + 1; i--) { // 确保剩余的天数>要复习的天数int idx = changeIndices[i] - 1;if (done[idx] != mx) {//判断是否考过试done[idx] = mx;exam--; // 考试study += nums[idx]; // 需要复习的天数} else if (study > 0) {study--; // 复习}}return exam == 0 && study == 0; // 考完了并且复习完了}
}

四,3049. 标记所有下标的最早秒数 II

二分 + 反悔贪心

该题和上一题有两个不一样的地方:

1)可以在第 i 天,一天就复习完 changIndices[i] 这门课程(快速复习)

2)可以在任意一天考任意一门课程

这里有一个需要注意的点:快速复习和慢速复习(一天一天复习,复习nums[i]天)是冲突的,会造成浪费,也就是说,一门课程要么使用快速复习,要么使用慢速复习,可以使用反证法证明,当一门课程即使用快速复习,又使用慢速复习,就会浪费慢速复习的时间。

还有一个问题,快速复习的时间是越早越好还是越晚越好?这点可以从贪心的思路去想,复习完的时间越早,就有更加充足的时间去考试,所以答案是越早越好。统计所有课程最早的快速复习时间。

根据上一题来看,这道题是否也可以使用二分答案去做呢?这也是可以的,因为它的单调性还与上道题一样:给的时间越多,复习的时间越充裕,越能够通过考试。

如何判断所给的天数是否充足,这道题只能从后往前遍历,因为从前往后遍历的话,无法知道是否有足够的时间用来考试。

从后往前遍历:

  • 当天不是一门课程快速复习的最早时间,cnt += 1
  • 当天是一门课程快速复习的最早时间:
  1. cnt>0,即有时间去考试,那么消耗一天去考试,cnt-=1
  2. nums[i]=0,即不需要时间复习,cnt+=1
  3. nums[i]=1,可以通过慢速复习,cnt+=1
  4. cnt=0,即没有时间去考试,但是不意味着该门课程一定是慢速复习,可以通过反悔贪心,去看看有没有原本使用快速复习,且nums[i]最小的课程,如果有,反悔这门课(快速复习一天+考试一天),多出来的这两天,用来做当天这门课的快速复习+考试

最后看看剩下的使用慢速复习+考试的天数是否大于实际上的慢速复习+考试的天数

代码如下:

class Solution {public int earliestSecondToMarkIndices(int[] nums, int[] changeIndices) {int n = nums.length;int m = changeIndices.length;if(n > m) return -1;long slow = n;for(int x : nums) slow += x;//统计慢速复习+考试需要多长时间int[] firstT = new int[n];//快速复习越早越好,这样就可以留更多的时间去考试Arrays.fill(firstT, -1);for(int i=m-1; i>=0; i--)firstT[changeIndices[i]-1] = i;PriorityQueue<Integer> que = new PriorityQueue<>((a,b)->a-b);int l = n, r = m;while(l <= r){que.clear();int mid = (l+r)/2;if(check(nums, changeIndices, firstT, que, slow, mid)){r = mid - 1;}else{l = mid + 1;}}return r+1>m ? -1 : r+1;}boolean check(int[] nums, int[] changeIndices, int[] firstT, PriorityQueue<Integer> que, long slow, int lastDay){int cnt = 0;//表示有多少时间可以用来慢速复习+考试for(int i=lastDay-1; i>=0; i--){//从后向前遍历int idx = changeIndices[i]-1;//当天可以快速复习的课程下标int x = nums[idx];//该课程需要几天复习if(x <= 1 || i != firstT[idx]){//复习1天 || 不是最早的快速复习时间 -> 可以使用慢速复习搞定cnt++;//当天可以用来慢速复习/考试continue;}if(cnt == 0){//复习>1天 && 是最早的快速复习时间没有慢速复习 && 没有时间用来考试 -> 看看有没有更节省的方式if(que.isEmpty() || x<=que.peek()){cnt++;//当天可以用来慢速复习/考试 即 该课程只能使用慢速复习continue;}slow += que.poll() + 1;//否则可以使que.poll()课程慢速复习+一天考试cnt += 2;//可以返还que.poll()课程所需的 1天快速复习 + 1天考试}slow -= x + 1;//减去当前课程复习天数+考试所需的一天cnt--;//当天快速复习 + 后面一天考试que.offer(x);}return cnt >= slow;//剩余留给慢速复习+考试的时间 > 实际所需慢速复习+考试的时间}
}

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

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

相关文章

盲人出行:科技创造美好的未来

在繁忙的都市中&#xff0c;我每天都要面对许多挑战&#xff0c;盲人出行安全保障一直难以得到落实。我看不见这个世界&#xff0c;只能依靠触觉和听觉来感知周围的一切。然而&#xff0c;我从未放弃过对生活的热爱和对未来的憧憬。在一次机缘巧合下&#xff0c;我认识了一款名…

C3_W2_Collaborative_RecSys_Assignment_吴恩达_中英_Pytorch

Practice lab: Collaborative Filtering Recommender Systems(实践实验室:协同过滤推荐系统) In this exercise, you will implement collaborative filtering to build a recommender system for movies. 在本次实验中&#xff0c;你将实现协同过滤来构建一个电影推荐系统。 …

VLAN实验报告

实验要求&#xff1a; 实验参考图&#xff1a; 实验过程&#xff1a; r1: [r1]int g 0/0/0.1 [r1-GigabitEthernet0/0/0.1]ip address 192.168.1.1 24 [r1-GigabitEthernet0/0/0.1]dot1q termination vid 2 [r1-GigabitEthernet0/0/0.1]arp broadcast enable [r1]int g 0/0/…

Mysql学习之MVCC解决读写问题

多版本并发控制 什么是MVCC MVCC &#xff08;Multiversion Concurrency Control&#xff09;多版本并发控制。顾名思义&#xff0c;MVCC是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。换言之&#xff0…

django的模板渲染中的【高级定制】:按数据下标id来提取数据

需求&#xff1a; 1&#xff1a;在一个页面中显示一张数据表的数据 2&#xff1a;不能使用遍历的方式 3&#xff1a;页面中的数据允许通过admin后台来进行修改 4&#xff1a;把一张数据表的某些内容渲染到[xxx.html]页面 5&#xff1a;如公司的新商品页面&#xff0c;已有固定的…

《梦幻西游》本人收集的34个单机版游戏,有详细的视频架设教程,值得收藏

梦幻西游这款游戏&#xff0c;很多人玩&#xff0c;喜欢研究的赶快下载吧。精心收集的34个版本。不容易啊。里面有详细的视频架设教程&#xff0c;可以外网呢。 《梦幻西游》本人收集的34个单机版游戏&#xff0c;有详细的视频架设教程&#xff0c;值得收藏 下载地址&#xff1…

阶跃信号与冲击信号

奇异信号&#xff1a;信号与系统分析中&#xff0c;经常遇到函数本身有不连续点&#xff08;跳变电&#xff09;或其导函数与积分有不连续点的情况&#xff0c;这类函数称为奇异函数或奇异信号&#xff0c;也称之为突变信号。以下为一些常见奇异函数。 奇异信号 单位斜变信号 …

Ubuntu18.04安装RTX2060显卡驱动+CUDA+cuDNN

Ubuntu18.04安装RTX2060显卡驱动CUDAcuDNN 1 安装RTX2060显卡驱动1.1 查看当前显卡是否被识别1.2 安装驱动依赖1.3 安装桌面显示管理器1.4 下载显卡驱动1.5 禁用nouveau1.6 安装驱动1.7 查看驱动安装情况 2 安装CUDA2.1 查看当前显卡支持的CUDA版本2.2 下载CUDA Toolkit2.3 安装…

车灯修复UV胶的优缺点有哪些?

车灯修复UV胶的优点如下&#xff1a; 优点&#xff1a; 快速固化&#xff1a;通过紫外光照射&#xff0c;UV胶可以在5-15秒内迅速固化&#xff0c;提高了修复效率。高度透明&#xff1a;固化后透光率高&#xff0c;几乎与原始车灯材料无法区分&#xff0c;修复后车灯外观更加…

对缓冲区的初步认识——制作进度条小程序

对缓冲区的初步认识--进度条小程序 前言预备知识回车和换行的区别输出缓冲区/n 有清空输出缓冲区的作用stdout是什么&#xff1f;验证一切皆文件为什么是\n行刷新&#xff1f; 倒计时程序原理 代码实现为什么这里要强制刷新&#xff1f;没有会怎样&#xff1f;为什么是输出的是…

RabbitMQ安装及使用

系列文章目录 文章目录 系列文章目录前言一、下载二、安装三、插件安装四、配置五、权限六、集群模式 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&…

【MATLAB源码-第154期】基于matlab的OFDM系统多径信道下块状和梳妆两种导频插入方式误码率对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM&#xff08;Orthogonal Frequency Division Multiplexing&#xff0c;正交频分复用&#xff09;是一种高效的无线信号传输技术&#xff0c;广泛应用于现代通信系统&#xff0c;如Wi-Fi、LTE和5G。OFDM通过将宽带信道划分…

RK3568 Android12 适配抖音 各大APP

RK3568 Android12 适配抖音 各大APP SOC RK3568 system:Android 12 平台要适配抖音和各大APP 平台首先打开抖音发现摄像头预览尺寸不对只存在右上角,我将抖音APP装在手机上预览,发现是全屏 一开始浏览各大博客 给出的解决方法是修改framework 设置为全屏显示: framewo…

Tomcat基础及与Nginx实现动静分离,搭建高效稳定的个人博客系统

目录 引言 一、TOMCAT基础功能 &#xff08;一&#xff09;自动解压war包 &#xff08;二&#xff09;状态页 1.登录状态页 2.远程登录 &#xff08;三&#xff09;服务管理界面 &#xff08;四&#xff09;Host虚拟主机 1.设置虚拟主机 2.建立站点目录与文件 二、实…

使用QEMU搭建U-Boot+LinuxKernel+busybox+NFS嵌入式开发环境

目录 0.课程大纲1.为什么要使用QEMU学习嵌入式QEMU简介使用QEMU可以做哪些事情?当前嵌入式行业现状如何适应这种变化使用QEMU学习嵌入式有哪些好处?驱动开发技能为什么要学习Linux 2.搭建嵌入式开发基本环境2.1.安装u-boot-tools2.2.安装交叉编译工具什么是ABI和EABI 3.QEMU安…

三、基准时钟、生成时钟、虚拟时钟的约束和意义

**前言&#xff1a;**前面从理论角度出发学习了时序分析的基本原理&#xff0c;本篇从设计的角度学习如何合理添加时钟约束。 文章目录 一、基准时钟&#xff08;base clock&#xff09;和生成时钟(generate clock)二、基准时钟的约束1.完成综合&#xff08;run implementatio…

linux的通信方案(SYSTEM V)

文章目录 共享内存(Share Memory)信号队列&#xff08;Message Queue&#xff09;信号量(semaphore) 进程间通信的核心理念&#xff1a;让不同的进程看见同一块资源 linux下的通信方案&#xff1a; SYSTEM V 共享内存(Share Memory) 特点&#xff1a;1.共享内存是进程见通信最…

排序(4)——堆排序

目录 堆排序&#xff08;回顾&#xff09; 基本思路 代码实现 向下调整排序 AdjustDown 建堆排序 时间复杂度 特性总结 堆排序&#xff08;回顾&#xff09; 重点回顾戳&#x1f449;堆排序 基本思路 堆排序(Heapsort)是指利用堆积树&#xff08;堆&#xff09;这种数…

鸿蒙系统开发适配注意事项

鸿蒙操作系统&#xff08;HarmonyOS&#xff09;的软件适配涉及到一些特定的注意事项&#xff0c;以确保应用程序在该操作系统上的正常运行和最佳性能。以下是适配鸿蒙软件时需要注意的一些关键问题&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的…

MySQL篇—执行计划介绍(第二篇,总共三篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…