Leetcode 3049. Earliest Second to Mark Indices II
- Leetcode 3049. Earliest Second to Mark Indices II
- 1. 解题思路
- 2. 代码实现
- 3. 算法优化
- 题目链接:3049. Earliest Second to Mark Indices II
1. 解题思路
这道题我看貌似难度报表,比赛的时候貌似只有36个人搞定了这道题目,然后最快的人耗时也花了40min以上,就很离谱,和平时基本15分钟就能有大佬全部做出来4道题的情况完全不懂,就很吓人。
所以基本上我对这道题也算是一个半放弃的状态,不过后来还是看了一下,然后发现其实也不是完全无法上手,本质上还是求一个处理的最优解,且显然这个操作依然是单调的,即从某一个位置开始,后续所有的操作序列都可以使得所有的位置都被mark上。
因此,最开始我的思路也是二分法来求任意一个位置作为操作序列的结束点时能否判断其是否可以使得所有的位置都被mark上,然后就和上一题一样,这里就变成了一个贪婪算法,要最优的分配点数使得所有的值都可以先降为0然后再mark上。
但是比较尴尬的是这里我们的贪婪算法并没有完成,因此有以下一个判断无法彻底想明白:
- 已知任何一次直接归零操作都必须附加一次mark操作进行完成,因此对于任意一个点,我们需要判断是否要等待后续直接操作位然后再多加一轮操作使之mark还是直接使用当前富裕的点数(如果有的话)进行归零然后mark。
因此后续干脆就是直接绕开这个,走了最暴力的动态规划的方法,遍历了所有的可能,即每一个位置到底是走的快速清零还是进行-1或者mark操作,这里,显然如果要进行快速清零那必然是在某个位置在changeIndices
当中最早出现的位置上。
但是,直接地实现会出现内存爆炸的情况,因此,我们做了一些不严谨的剪枝,即如果某次快速清零可以省出100以上的富裕,那么必走快速清零,反之考虑是否忽略掉这个快速清零的路线。
需要强调,这个方式是不严谨的,因为如果存在全面富裕了非常多的点数远大于100,而最后来一个可以清空100的操作,那不一定要走快速清零的,因为那样会需要额外多一次操作。
但是对于绝大多数的情况上述结果是对的,在这里也确实可以通过测试样例。
2. 代码实现
给出python代码实现如下:
class Solution:def earliestSecondToMarkIndices(self, nums: List[int], changeIndices: List[int]) -> int:n, m = len(nums), len(changeIndices)changeIndices = [x-1 for x in changeIndices]needed = sum(nums) + nfirst_seen = {}for i, x in enumerate(changeIndices):if x not in first_seen and nums[x] > 1:first_seen[x] = ifirst_seen = {v:k for k, v in first_seen.items()}@lru_cache(None)def dp(idx, need, extra):if need <= 1 and extra <= 1:return idxelif idx >= m:return mif idx not in first_seen:return dp(idx+1, need-1, max(extra-1, 0))i = first_seen[idx]if nums[i] >= 100:return dp(idx+1, need-nums[i], extra+1)else:return min(dp(idx+1, need-1, max(extra-1, 0)), dp(idx+1, need-nums[i], extra+1))ans = dp(0, needed, 0)return ans+1 if ans != m else -1
提交代码评测得到:耗时1219ms,占用内存288.9MB。
3. 算法优化
因为前面也反复强调了,上述解法有效,但是剪枝的存在使得上述解法并不严谨,因此,我们在这里摘录一下其他大佬们的解法作为补充,有兴趣的读者可以自行研读学习一下,这里就让我偷个懒了……
class Solution:def earliestSecondToMarkIndices(self, nums: List[int], changeIndices: List[int]) -> int:first_idx = [-1] * len(nums)for i in range(len(changeIndices)):if first_idx[changeIndices[i]-1] == -1:first_idx[changeIndices[i]-1] = ifor i, num in enumerate(nums):if num <= 1:first_idx[i] = -1default_needs = sum(nums) + len(nums)def is_possible(k):left = 0h = []pos_count = 0flag = Falsefor j in range(k, -1, -1):if flag:pos_count += 1flag = Falseelse:flag = Trueleft += 1i1 = first_idx[changeIndices[j]-1]if i1 == j:heapq.heappush(h, [nums[changeIndices[j]-1] - 1, changeIndices[j]-1])if len(h) > pos_count:heapq.heappop(h)return default_needs - sum(h1[0] for h1 in h) <= leftans = 0return ansl, r = len(nums)-1, len(changeIndices)-1while l < r:m = (l + r) // 2if is_possible(m):r = melse:l = m + 1if l > r or not is_possible(l):return -1return l+1
相关文章:
Leetcode 3049. Earliest Second to Mark Indices II
Leetcode 3049. Earliest Second to Mark Indices II 1. 解题思路2. 代码实现3. 算法优化 题目链接:3049. Earliest Second to Mark Indices II 1. 解题思路 这道题我看貌似难度报表,比赛的时候貌似只有36个人搞定了这道题目,然后最快的人…...

CrossOver 24下载-CrossOver 24 for Mac下载 v24.0.0中文永久版
CrossOver 24是一款可以让mac用户能够自由运行和游戏windows游戏软件的虚拟机类应用,虽然能够虚拟windows但是却并不是一款虚拟机,也不需要重启系统或者启动虚拟机,类似于一种能够让mac系统直接运行windows软件的插件。它以其出色的跨平台兼容…...

算法设计.
文章目录 1. 贪心算法:只看当前1.1 零钱兑换问题:力扣322 2. 活动选择问题3. 动态规划3.1 不同路径:3.2 0-1背包问题3.3 完全背包问题3.4 零钱兑换-动态规划 4. 最长公共字串--动态规划5. 最长公共子序列 1. 贪心算法:只看当前 1…...
20240304金融读报:票据贴现数据挖掘与新质生产力信贷创新
1、【他山之石】票据贴现数据挖掘:邮储三步走(为存量科技企业提供贴现、拉国家科技名单拓客、通过贴现激活睡眠对公户、提供不止贴现业务) 2、【宏观经济】函数推算的潜在增长率2025之前为4%,2025-2035间为3%。破局在于通过改革、…...

05. Nginx入门-Nginx访问控制
测试环境 此处使用的yum安装的Nginx路径。 此处域名均在本地配置hosts。 主配置文件 路径:/etc/nginx/nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connection…...

S2---FPGA-A7板级原理图硬件实战
视频链接 FPGA-A7板级系统硬件实战01_哔哩哔哩_bilibili FPGA-A7板级原理图硬件实战 基于XC7A100TFGG484的FPGA硬件设计流程图 A7核心板,是基于XILINX公司的ARTIX-7系列100T的XC7A100T,2FGG484I这款芯片开发的高性能核心板,具有高速,高带宽&a…...

RK DVP NVP6158配置 学习
NVP6158简介 NVP6158C是一款4通道通用RX,提供高质量图像的芯片。它接受来自摄像机和其他视频信号的独立4通道通用输入来源。它将4通道通用1M至8M 7.5P视频格式数字化并解码为代表8位ITU-R BT.656/1120 4:2:2格式的数字分量视频,并将单独的BT.601格式与27…...

C++基础2:C++基本数据类型和控制结构
此专栏为移动机器人知识体系下的编程语言中的 C {\rm C} C从入门到深入的专栏,参考书籍:《深入浅出 C {\rm C} C》(马晓锐)和《从 C {\rm C} C到 C {\rm C} C精通面向对象编程》(曾凡锋等)。 2.C基本数据类型和控制结构 2.1 C基本数据类型 程序是由算法…...

HFSS仿真双频微带天线学习笔记
HFSS仿真双频微带天线 文章目录 HFSS仿真双频微带天线1、 求解器设置2、 建模3、 激励方式设置4、 边界条件设置5、 扫频设置6、 设计检查,仿真分析7、 数据后处理 这里重点关注HFSS软件的操作,关于理论知识将在后面的文章中进行更新。 设计要求…...
【十一】【SQL】外连接(左外连接,右外连接)
数据库中的外连接(Outer Join)用于连接两个表,并包括两个表中的匹配行以及左表(LEFT JOIN)或右表(RIGHT JOIN)中未匹配的行。外连接分为两种主要类型: 左外连接(LEFT OU…...

敏捷开发模型:一种灵活、协作和持续的软件开发方法
敏捷开发模型:一种灵活、协作和持续的软件开发方法 引言 在软件开发领域,随着市场需求的不断变化和技术的迅速发展,传统的瀑布模型逐渐暴露出其局限性。为了应对这些挑战,敏捷开发模型应运而生。敏捷开发模型强调灵活、协作和持…...

软件设计师10--计算机组成与体系结构章节回顾
软件设计师10--计算机组成与体系结构章节回顾 章节重要内容考情分析 章节重要内容 考情分析...

数据库分库分表中间件选择
目前分库分表的中间件有三种设计思路,分别是: 采用分散式架构,适用于用Java开发的高性能轻量级OLTP应用程序,以Sharding-JDBC为代表。采用中间层Proxy架构,提供了静态输入和所有语言支持,适用于OLAP应用程…...

代码随想录算法训练营第22天|235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
目录 一、力扣235.二叉搜索树的最近公共祖先1.1 题目1.2 思路1.3 代码 二、力扣701.二叉搜索树中的插入操作2.1 题目2.2 思路2.3 代码 三、力扣450.删除二叉搜索树中的节点3.1 题目3.2 思路3.3 代码3.4 总结 一、力扣235.二叉搜索树的最近公共祖先 1.1 题目 1.2 思路 利用二叉…...
基于SpringBoot的医护人员排班系统详细开题报告(源码)
项目源码:https://gitee.com/oklongmm/biye2 引言 医护人员排班系统是医疗机构中的重点管理工作之一。借助现代化的计算机技术,可以大大提升排班的效率和精准度。因此,本研究旨在使用SpringBoot框架设计和实现一个功能完善的医护人员排班…...

CDH6.3.1离线安装
一、从官方文档整体认识CDH 官方文档地址如下: CDH Overview | 6.3.x | Cloudera Documentation CDH是Apache Hadoop和相关项目中最完整、测试最全面、最受欢迎的发行版。CDH提供Hadoop的核心元素、可扩展存储和分布式计算,以及基于Web的用户界面和重…...
Pytorch之卷积操作
卷积是一种基本的数学操作,常用于信号处理和图像处理领域。在计算机视觉中,卷积操作是一种重要的技术,用于提取图像的特征并进行图像处理。 卷积操作基于一个卷积核(也称为滤波器或权重),它是一个小的矩阵…...

2024年春招小红书前端实习面试题分享
文章目录 导文面试重点一、方便介绍一下,你之前实习都做了什么嘛?二、 可以讲一下封装组件相关逻辑嘛?1. 为什么要封装组件?2. 封装组件的步骤3. 封装组件的原则4. 组件的复用和扩展5. 组件的维护和文档 三、项目的性能优化你有什…...

软件测试--性能测试工具JMeter
软件测试--性能测试工具JMeter 主流性能测试工具1.主流性能测试工具Loadrunner和Jmeter对比 —— 相同点2.主流性能测试工具Loadrunner和Jmeter对比 —— 不同点JMeter基本使用JMeter环境搭建1.安装JDK:2.安装Jmeter:3.注意点:JMeter功能概要1. JMeter文件目录介绍1.1 bin目…...

c++/c图的邻近矩阵表示
#include<iostream> using namespace std;#define MaxVerterNum 100 typedef char VerterType; typedef int EdgeType; typedef struct {VerterType vexs[MaxVerterNum]; // 存储顶点EdgeType edges[MaxVerterNum][MaxVerterNum]; // 存储邻接矩阵int n, e; // 顶点数和边…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...