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

news2024/9/22 21:16:30

 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%的测试用例,但很明显,节点选取和处理有错误

    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(结果),是前面考虑后得到的结果,接下来需要判断的就是:后面可能出现的连续情况

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;
    }
}

方法二:使用队列。

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

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. 处理入队操作,保持队列中的值递减,保证队头为当前窗口内的最大 chargeTimes
            while (!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)代码

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,遍历后直接输出。

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();
    }
}

方法二:差分

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) 是区间的起始位置,在起始位置处 +1
            diff[interval.get(0)]++;
            // interval.get(1) 是区间的结束位置,结束位置的下一位 -1
            diff[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.coloradmin.cn/o/2144335.html

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

相关文章

ELFK日志分析平台,架构和通信

整个架构&#xff0c;加上跳板机&#xff0c;总共12台机器 技术方案&#xff1a; 1. 配置nfs服务器&#xff0c;为web集群提供共享网络文件系统 # 部署 NFS 服务 [rootnfs ~]# dnf install -y nfs-utils [rootnfs ~]# vim /etc/exports /var/webroot 192.168.1.0/24(rw,…

当代世界最著名的哲学家颜廷利:21世纪全球华人最前沿的思想家教育家

在人类的视觉体验中&#xff0c;仅有两种现象深刻影响着我们的视力&#xff1a;近视与老花。前者多在青少年时期悄然降临&#xff0c;而后者则常伴随中年之后的生活。有趣的是&#xff0c;当我们以创意的眼光观察英文字母时&#xff0c;bd组合呈现出的向下眼镜提醒我们&#xf…

Red Hat 和 Debian Linux 对比

原图的作者(https://bbs.deepin.org/post/209759) Red Hat Enterprise Linux https://www.redhat.com/ CentOS Linux https://www.centos.org/ Fedora Linux https://fedoraproject.org/ Debian https://www.debian.org/ Ubuntu https://cn.ubuntu.com/ https://ubuntu.c…

【C++ | tips】const Date* operator() const中这两个const有什么区别?他们的作用是什么?

const Date* operator&() const { return this; } 我们要明白operator&()这个函数是做什么的。 在C中&#xff0c;&操作符通常用于获取一个对象的地址。但是&#xff0c;有时候我们想要自定义这个行为&#xff0c;比如说&#xff0c;我们想要控制别人怎么获取…

【linux-Day3】linux的基本指令<中>

【linux-Day3】linux的基本指令<中> linux下的基本指令&#x1f4e2;man&#xff1a;访问linux手册页&#x1f4e2;echo&#xff1a;把字符串写入指定文件中&#x1f4e2;cat&#xff1a;查看目标文件的内容&#x1f4e2;cp&#xff1a;复制文件或目录&#x1f4e2;mv&am…

Scrapy爬虫IP代理池:提升爬取效率与稳定性

在互联网时代&#xff0c;数据就是新的黄金。无论是企业还是个人&#xff0c;数据的获取和分析能力都显得尤为重要。而在众多数据获取手段中&#xff0c;使用爬虫技术无疑是一种高效且广泛应用的方法。然而&#xff0c;爬虫在实际操作中常常会遇到IP被封禁的问题。为了解决这个…

详解RFM模型

详解RFM模型 一、定义二、RFM模型的三个指标1‌、最近一次消费&#xff08;Recency&#xff09;‌2、消费频率&#xff08;Frequency&#xff09;‌3、消费金额&#xff08;Monetary&#xff09;‌ 三、RFM模型的应用和分类1、精细化营销2、提升客户满意度3、风险管理4、产品优…

超详细超实用!!!零基础java开发之云风笔记更新数据接口开发(十)

云风网 云风笔记 云风知识库 一、service/NoteApi新增updateNode接口定义 public interface NoteApi {...int updateNote(NoteManage noteManage); }二、service/impl/NoteServiceImpl接口实现逻辑 public class NoteServiceImpl implements NoteApi {AutowiredNoteMapper n…

5、SAP定义科目组和字段控制

定义解释 用于创建科目组&#xff0c;并进行输入控制&#xff0c;即在输入科目时&#xff0c;哪些自动允许输入&#xff0c;哪些自动隐藏等。科目组是将性质类似的科目分类&#xff0c;组要维护前台会计科目主数据。(统驭科目–字段状态组–凭证输入)。 后台配置 路径&#…

当电脑错误:msvcp140.dll丢失的解决方法?总结七种修复方法

在使用 Windows 操作系统时&#xff0c;许多用户可能会遇到系统会弹出错误消息&#xff0c;提示“msvcp140.dll 丢失”或“msvcp140.dll 未找到”的问题。这个动态链接库文件是 Microsoft Visual C 2015 Redistributable Package 的一部分&#xff0c;用于支持使用 Visual C 20…

linux 双网卡服务器突然断电后网卡单通故障解决

某台linux 双网卡服务器突然断电后网卡单通故障解决 故障现象&#xff1a;断电后重启服务器&#xff0c;主用网卡IP只能同网段访问&#xff0c;其他网段无法访问&#xff0c;备用网卡则正常&#xff1b; 解决方案&#xff1a;route -n查询路由信息&#xff0c;发现主网卡路由…

使用Microsoft Visual Studio Installer Projects 2022打包桌面程序

安装扩展程序 在Visual Studio中点击扩展->管理扩展&#xff0c;搜索并安装Microsoft Visual Studio Installer Projects 2022 安装程序打包 新建打包项目 在当前解决方案下添加Setup 项目&#xff0c;添加新项目时&#xff0c;搜索并选择使用上一步安装的Setup Projec…

Java学习Day42:骑龙救!(springMVC)

springMVC与sevlet都是对应表现层web的&#xff0c;但是越复杂的项目使用SpringMVC越方便 基于Java实现MVC模型的轻量级web框架 目标&#xff1a; 小案例&#xff1a; 1.导入依赖 spring-context: 提供 Spring 框架的核心功能&#xff0c;如依赖注入、事件发布和其他应用上…

嵌入式开发—CAN通信协议详解与应用(下)

书接上回&#xff1a; 嵌入式开发—CAN通信协议详解与应用&#xff08;中&#xff09;-CSDN博客 注&#xff1a;本文只是说明了如何进行基础的CAN收发操作&#xff0c;复杂CAN操作可以看这篇文章 Linux 底软开发——对CAN的详细操作&#xff08;周期发送&#xff0c;异常检测…

VMware ESXi 8.0U3b 发布下载,新增功能概览

VMware ESXi 8.0U3b 发布下载&#xff0c;新增功能概览 同步发布 Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科)、Hitachi (日立)、Fujitsu (富士通)、NEC (日电) 定制版 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-8-u3/&#…

3分钟了解 跨网文件安全交换的最佳方案是什么

跨网文件交换的背景介绍 跨网文件安全交换是指在不同网络环境下&#xff08;如不同的组织、企业、机构或国家&#xff09;进行文件传输时&#xff0c;确保文件的安全性、完整性和保密性。随着信息技术的发展和网络的广泛应用&#xff0c;跨网文件交换变得越来越普遍&#xff0…

QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第五期]

QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第五期] 第五期介绍&#xff1a;频道模块之接口授权管理和发言管理 目录 QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第五期]第五期介绍&#xff1a;频道模块之接口授权管理和发言管理获取机器人在频道可用权限列表…

电磁场与电磁波 1.1矢量基础知识

1.标量 2.矢量 大小方向 用有方向的线段表示 在直角坐标系下 3.运算法则 (1)加法&#xff1a;平行四边形法则 (2)乘法&#xff1a;点乘&叉乘 点乘 两个向量a与b的内积为 ab |a||b|cos∠(a, b)&#xff0c;特别地&#xff0c;0a a0 0&#xff1b;若…

Kettle的安装与基本使用

什么是Kettle&#xff1f; Kettle最早是一个开源的ETL&#xff08;Extract-Transform-Load的缩写&#xff09;工具&#xff0c;全称为KDE Extraction, Transportation, Transformation and Loading Environment。是一个功能丰富的ETL工具&#xff0c;它允许用户轻松地进行数据抽…

老板电器让AI融入烹饪?老板数字厨电实力展示AI做饭!

AI技术的迅猛发展已经深刻地改变了众多行业的面貌&#xff0c;其影响力远远超出了计算机科学本身的范畴。在追求生产效率与自动化的道路上&#xff0c;AI无疑成为最强大的驱动力之一&#xff0c;正是在这样的背景下&#xff0c;老板电器发布的「食神」AI大模型也为老板数字厨电…