【LeetCode每日一题】2024年9月第二周(下)

news/2024/12/22 13:16:36/

 2024.9.13  困难  难度评分1917

链接:2398. 预算内的最多机器人数目

(1)题目描述:

(2)示例

(3)分析

        翻译一下题目:要求我们在给定的 chargeTimesrunningCosts 数组以及发 budget的限制下,找到机器人运行的最长连续子数组,使得所有机器人的总运行成本不超过预算。

         那么思路还是比较明确的,我们用两个标识符left,right限定住既定的数据范围,然后依据:max(chargeTimes[l:r]) + (r - l + 1) * sum(runningCosts[l:r])<=budget,来进行取舍。下面是大致代码思路。

一开始的思路,可以过40%的测试用例,但很明显,节点选取和处理有错误

java">    public int maximumRobots(int[] chargeTimes, int[] runningCosts, long budget) {int sum=0; int max=0; int left=0; int temp=0; int len=chargeTimes.length;//定义标识符for (int right = 0; right < len; right++) {//从左向右遍历,判断是否符合if(chargeTimes[right]>max)  max=chargeTimes[right];//更新最大值sum+=runningCosts[right];if(max+sum*(right-left+1)>budget){temp =Math.max(temp,right-left+1);//temp循环更新,确定最大值}else { left = right;max=0;sum=0; //对sum、max进行复原==》应当是回归到舍去值之后的状态}}return temp;}

(4)代码

方法一:滑动窗口?

为什么超预算的时候,必须舍弃掉left?因为题目要求他必须连续,断开时已经得到一个temp(结果),是前面考虑后得到的结果,接下来需要判断的就是:后面可能出现的连续情况

java">class Solution {public int maximumRobots(int[] chargeTimes, int[] runningCosts, long budget) {long sum=0;long max=0;int left=0;long temp=0;long len=chargeTimes.length;for (int right = 0; right < len; right++) {max=Math.max(max,chargeTimes[right]);sum+=runningCosts[right];//判断超预算了,此处必须断开,因为必须连续,所以去掉头部,判断接下来的可能的情况while(max+ sum *(right-left+1)>budget){sum-=runningCosts[left];left++;max = 0;for (int i = left; i <= right; i++) {//此处必须重新计算,因为前面已经去掉头部了max=Math.max(max,chargeTimes[i]);}}temp=Math.max(temp,right-left+1);}return (int) temp;}
}

方法二:使用队列。

维护最长连续子数组,入和出皆和一个队列的入队出队相似,于是就变为了队列的基本操作。代码如下:

java">class Solution {public int maximumRobots(int[] chargeTimes, int[] runningCosts, long budget) {int ans = 0; // 用于存储符合条件的最长子数组长度int left = 0; // 滑动窗口的左边界long sum = 0; // 当前窗口内的 runningCosts 总和Deque<Integer> q = new ArrayDeque<>(); // 双端队列,用来维护当前窗口的最大 chargeTimes 值的索引// 遍历 chargeTimes 数组,right 表示滑动窗口的右边界for (int right = 0; right < chargeTimes.length; right++) {// 1. 处理入队操作,保持队列中的值递减,保证队头为当前窗口内的最大 chargeTimeswhile (!q.isEmpty() && chargeTimes[right] >= chargeTimes[q.peekLast()]) {q.pollLast(); // 弹出队尾元素,确保队列内维持递减顺序}q.addLast(right); // 将当前元素索引加入队列尾部// 更新窗口内 runningCosts 的总和sum += runningCosts[right];// 2. 如果当前窗口的总成本超出预算,则需要调整窗口左边界,缩小窗口while (!q.isEmpty() && chargeTimes[q.peekFirst()] + (right - left + 1) * sum > budget) {// 如果队头的元素索引已经超出窗口左边界,移除队头if (q.peekFirst() == left) {q.pollFirst(); // 弹出队头,更新最大 chargeTimes}// 调整窗口,减少窗口的总 runningCosts,左边界右移sum -= runningCosts[left];left++;}// 3. 更新答案,当前窗口大小为 (right - left + 1)ans = Math.max(ans, right - left + 1);}// 返回符合条件的最大窗口大小,即最大机器人数量return ans;}
}

(5)碎碎念

方法一,一开始直接没看范围,直接给我超了!看到测试用例的那一刻,确实有点无语。

 2024.9.14 中等  难度评分1348

链接:2390. 从字符串中移除星号

(1)题目描述:

(2)示例

(3)分析

        emm,实际上感觉,类似简单题。

        题目要求我们对一个字符串进行变换,就是删除星号和它左边的字符。我们观察只要返回值即可,没顺序要求。所以我们直接把他转换为一个字符的集合或数组,然后从左往右直接替换即可。遇到*必然是最后一位,直接去除即可,其余添加进去。

(4)代码

java">class Solution {public String removeStars(String s) {StringBuilder st = new StringBuilder();//StringBuilder,方便调用函数进行操作for (char c : s.toCharArray()) {//把他转换为一个字符的集合或数组,从左往右直接替换。if (c == '*') {// 遇到*必然是最后一位,直接去除即可,其余添加进去st.deleteCharAt(st.length() - 1);} else {st.append(c);}}return st.toString();}
}

(5)碎碎念

还行,没有花太长时间。

 2024.9.15 简单  难度评分1230

链接:2848. 与车相交的点

(1)题目描述:

(2)示例

(3)分析

        这题目,一开始还没理解啥意思。结果就是:所有数组内,包含几个不同的数的问题。 有不同,那直接:hashset,自带去重属性,所以直接调用。或者每个独自计算,也可以。

(4)代码

方法一:hashset,遍历后直接输出。

java">class Solution {public int numberOfPoints(List<List<Integer>> nums) {HashSet j=new HashSet(); //hashset,自带去重属性,所以直接调用for(List<Integer> num:nums){for (int i=num.get(0);i<=num.get(1);i++){j.add(i);}}return j.size();}
}

方法二:差分

java">class Solution {public int numberOfPoints(List<List<Integer>> nums) {int maxEnd = 0; // 用于存储所有区间的最大结束位置// 遍历每个区间,找到最大结束位置for (List<Integer> p : nums) {maxEnd = Math.max(maxEnd, p.get(1)); // p.get(1) 是当前区间的结束位置}// 差分数组,长度为最大结束位置加 2。这样确保我们可以处理到 [end + 1] 的情况int[] diff = new int[maxEnd + 2];// 根据每个区间来构建差分数组for (List<Integer> interval : nums) {// interval.get(0) 是区间的起始位置,在起始位置处 +1diff[interval.get(0)]++;// interval.get(1) 是区间的结束位置,结束位置的下一位 -1diff[interval.get(1) + 1]--;}int ans = 0; // 用于存储覆盖的点数int s = 0;   // 维护当前累积的区间覆盖数// 遍历差分数组,通过前缀和计算每个点的覆盖情况for (int d : diff) {s += d; // 更新当前点的覆盖数量if (s > 0) { // 如果当前点被至少一个区间覆盖ans++; // 统计覆盖的点数}}return ans; // 返回被至少一个区间覆盖的点的总数}
}

(5)碎碎念

简单题,所以,多看了一种思路。完~


http://www.ppmy.cn/news/1527348.html

相关文章

阿里部分集团内部中间件简介

目录 Pandora BootHSFMetaQTDDLXdbOTSOceanBaseSwitchEagleEyeSLSSunfirePandora Boot 背景与需求 在阿里巴巴内部,几乎所有的应用程序都依赖于多种中间件(例如HSF、TDDL、Diamond等),而这些中间件之间常常存在版本冲突和依赖问题。传统的Maven依赖管理工具只能通过排除冲…

科技创新驱动未来发展

正文&#xff1a; 科技创新是推动国家发展的重要力量。近年来&#xff0c;我国在科技创新方面取得了举世瞩目的成果。本文将探讨科技创新的重要性及其在未来的发展趋势。 一、科技创新的重要性 提升国家竞争力&#xff1a;科技创新是提高国家综合实力的重要途径。 促进产业升…

Tomcat中如何指定Jdk版本

在Tomcat的bin目录下&#xff0c;有两个脚本文件&#xff1a;catalina.sh&#xff08;Unix/Linux系统&#xff09;和startup.bat&#xff08;Windows系统&#xff09;。你可以在这两个脚本文件中设置JAVA_HOME环境变量&#xff0c;指向你想要使用的JDK安装路径。 对于Unix/Linu…

现在量化中普遍使用QMT和PTrade?哪家可以同时提供QMT/PTrade?

QMT的特点 全面的功能集成&#xff1a; QMT集成了行情显示、策略研究、交易执行和风控管理于一体&#xff0c;为投资者提供了一站式的量化交易解决方案。 高效的交易执行能力&#xff1a; 通过全内存交易实现低延迟的交易执行&#xff0c;单笔延时小于1ms&#xff0c;确保了交易…

计算机网络 ---- OSI参考模型TCP/IP模型

目录 一、OSI参考模型 1.1 学习路线 1.2 OSI参考模型和TCP/IP模型 1.3 具体设备与具体层次对应关系 1.3.1 物理层 1.3.2 数据链路层 1.3.3 网络层 1.3.4 传输层 1.3.5 会话层、表示层、应用层 1.4 各层次数据传输单位 二、TCP/IP模型 2.1 学习路线 2.2 TCP/I…

PowerShell 脚本编写 :自动化Windows 开发工作流程

PowerShell 脚本编写 &#xff1a;自动化Windows 开发工作流程 在现代开发工作中&#xff0c;自动化已成为提高生产力的关键部分。对于 Windows 用户&#xff0c;PowerShell 是一种强大的自动化工具&#xff0c;它能够帮助开发者简化和自动化日常任务。本文将介绍如何使用 Pow…

QT打开摄像头采集

QT打开摄像头采集 今天好不容易把opencv的环境装好&#xff0c;然后想学习一下人脸识别的功能&#xff0c;但是在图书馆坐了4个多小时了&#xff0c;屁股疼就先写个摄像头采集的功能&#xff0c;明天继续学习吧&#xff0c;废话不多&#xff0c;嚼个奶片开始发车&#xff01;&…

K8s 简介以及详细部署步骤

Kubernetes 简介 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个阶段&#xff1a; 1、传统部署 互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点&#xff1a;不能为应用程序定义资源…