Leetcode每日一题2055. 蜡烛之间的盘子 前缀和+预处理 dp多次超时之后的反思

本文主要是介绍Leetcode每日一题2055. 蜡烛之间的盘子 前缀和+预处理 dp多次超时之后的反思,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

📖本篇内容:Leetcode每日一题2055. 蜡烛之间的盘子 前缀和+预处理 / 二分

📑 文章专栏:leetcode每日一题《打卡日常》

📆 最近更新:2022年3月7日 Leetcode每日一题 504. 七进制数 简单的模拟进制计算 / 栈的合理运用 /JDK源码API的理解与使用

⭐算法仓库:小付的算法之路——Alascanfu-algorithm.git.io

🙊个人简介:一只二本院校在读的大三程序猿,本着注重基础,打卡算法,分享技术作为个人的经验总结性的博文博主,虽然可能有时会犯懒,但是还是会坚持下去的,如果你很喜欢博文的话,建议看下面一行~(疯狂暗示QwQ)

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 关爱程序猿,从你我做起

🙊本文目录👍

  • 🙊写在前面🙊
  • 题目
    • 提示
    • 📝思路📝
    • ⭐代码实现⭐
    • 运行结果
  • 🙊写在最后🙊

🙊写在前面🙊

来了来了,吃过午饭就来写题解啦~

题目

给你一个长桌子,桌子上盘子和蜡烛排成一列。给你一个下标从 0 开始的字符串 s ,它只包含字符 ‘’ 和 ‘|’ ,其中 '’ 表示一个 盘子 ,’|’ 表示一支 蜡烛 。

同时给你一个下标从 0 开始的二维整数数组 queries ,其中 queries[i] = [lefti, righti] 表示 子字符串 s[lefti…righti] (包含左右端点的字符)。对于每个查询,你需要找到 子字符串中 在 两支蜡烛之间 的盘子的 数目 。如果一个盘子在 子字符串中 左边和右边 都 至少有一支蜡烛,那么这个盘子满足在 两支蜡烛之间 。

比方说,s = “||**||**|*” ,查询 [3, 8] ,表示的是子字符串 “*||**|” 。子字符串中在两支蜡烛之间的盘子数目为 2 ,子字符串中右边两个盘子在它们左边和右边 都 至少有一支蜡烛。
请你返回一个整数数组 answer ,其中 answer[i] 是第 i 个查询的答案。

示例1:
在这里插入图片描述

输入:s = "**|**|***|", queries = [[2,5],[5,9]]
输出:[2,3]
解释:
- queries[0] 有两个盘子在蜡烛之间。
- queries[1] 有三个盘子在蜡烛之间。

示例2:
在这里插入图片描述

输入:s = "***|**|*****|**||**|*", queries = [[1,17],[4,5],[14,17],[5,11],[15,16]]
输出:[9,0,0,0,0]
解释:
- queries[0] 有 9 个盘子在蜡烛之间。
- 另一个查询没有盘子在蜡烛之间。

提示

  • 3 <= s.length <= 10^5
  • s 只包含字符 '*' 和 '|' 。
  • 1 <= queries.length <= 10^5
  • queries[i].length == 2
  • 0 <= lefti <= righti < s.length

📝思路📝

本题考查知识点

  • 思路:这道题小付在凌晨的时候就尝试的做了一下,用的是 dp 也是统计当前盘子下标位置时的左侧的蜡烛个数与当前盘子位置下标位置时的右侧的蜡烛个数,毫无疑问超时了O( n*m )的时间复杂度 同时也开辟了3个数组空间用于存储数据所以就只好睡觉一早起来想了。
  • 第二天一早想着前天的前缀和与预处理的方法以及uu们的提示我就知道了这道题是可以采用前缀和+预处理来解决的,不过这里我们的预处理的左右侧蜡烛就不再是个数 ,反而是左右侧最近的蜡烛下标是否在我们的子字符串范围内,这样一来就只需要一次遍历就可以进行预处理,判断当前位置下的左侧最近右侧最近蜡烛位置下标是否没有重合且在子字符串的范围之内,则可以记录当前位置下的满足条件的盘子个数

⭐代码实现⭐

模拟进制计算

class Solution {public int[] platesBetweenCandles(String s, int[][] queries) {int m = s.length();int n = queries.length;// 分别用于记录当前位置下其左侧最近的蜡烛下标位置,以及当前位置下右侧最近的蜡烛下标位置int[] leftNearestCan = new int [m+1],rightNearestCan = new int [m+1],prefix = new int[m+1];// 初始化边界 如果找不到最近的蜡烛 则直接返回边界位置leftNearestCan[0] = -1;rightNearestCan[m] = m;// 预处理for (int i = 1;i<=m;i++){// 用来求取当前位置的盘子个数prefix[i] = prefix[i-1] + (s.charAt(i-1) == '*' ? 1 : 0);// 这里是获取当前位置下 左侧最近的蜡烛下标leftNearestCan[i] = (s.charAt(i-1) == '|' ? i-1 : leftNearestCan[i-1]);// 这里是获取当前位置下 右侧最近的蜡烛下标rightNearestCan[m-i] = (s.charAt(m-i) == '|'? m-i : rightNearestCan[m-i+1]);}int[] res = new int [n];for (int i = 0 ; i< n;i++){// 记录当前查询位置的右侧最近的Idx,以及当前查询位置的左侧最近|的 Idxint lIdx = rightNearestCan[queries[i][0]],  rIdx = leftNearestCan[queries[i][1] + 1];// 为了防止当前查询左右位置相同 也就是子字符串为1的情况下 跳过当前查询if(lIdx+1 >= rIdx)continue;// 前缀和计算当前位置的满足条件的盘子个数res[i] = prefix[rIdx+1] - prefix[lIdx]; }return res;}
}
  • 时间复杂度:O(n+m)
  • 空间复杂度:O(m) 这里开了两个大小为m+1的记录左侧下标位置和右侧下标位置的数组 结果数组不计入

运行结果

前缀和 + 预处理
在这里插入图片描述

🙊写在最后🙊

2022-3-8今天小付打卡了哦~

美好的日出 美好的山河

都因有你存在 而璀璨 耀眼

在这里插入图片描述

这篇关于Leetcode每日一题2055. 蜡烛之间的盘子 前缀和+预处理 dp多次超时之后的反思的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/377025

相关文章

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、

Java CompletableFuture如何实现超时功能

《JavaCompletableFuture如何实现超时功能》:本文主要介绍实现超时功能的基本思路以及CompletableFuture(之后简称CF)是如何通过代码实现超时功能的,需要的... 目录基本思路CompletableFuture 的实现1. 基本实现流程2. 静态条件分析3. 内存泄露 bug

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Springboot使用RabbitMQ实现关闭超时订单(示例详解)

《Springboot使用RabbitMQ实现关闭超时订单(示例详解)》介绍了如何在SpringBoot项目中使用RabbitMQ实现订单的延时处理和超时关闭,通过配置RabbitMQ的交换机、队列和... 目录1.maven中引入rabbitmq的依赖:2.application.yml中进行rabbit

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

hdu4826(三维DP)

这是一个百度之星的资格赛第四题 题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=500 题意:从左上角的点到右上角的点,每个点只能走一遍,走的方向有三个:向上,向下,向右,求最大值。 咋一看像搜索题,先暴搜,TLE,然后剪枝,还是TLE.然后我就改方法,用DP来做,这题和普通dp相比,多个个向上

hdu1011(背包树形DP)

没有完全理解这题, m个人,攻打一个map,map的入口是1,在攻打某个结点之前要先攻打其他一个结点 dp[i][j]表示m个人攻打以第i个结点为根节点的子树得到的最优解 状态转移dp[i][ j ] = max(dp[i][j], dp[i][k]+dp[t][j-k]),其中t是i结点的子节点 代码如下: #include<iostream>#include<algorithm