当前位置: 首页 > news >正文

838. 推多米诺

题目链接

838. 推多米诺 - 力扣(LeetCode)

题目描述

n张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立。在开始时,把一些多米诺骨牌向左或向右推。

每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。同样地,倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。

如果一张垂直竖立的多米诺骨牌的两侧同时有多米诺骨牌倒下时,由于受力平衡, 该骨牌仍然保持不变。

就这个问题而言,我们会认为一张正在倒下的多米诺骨牌不会对其它正在倒下或已经倒下的多米诺骨牌施加额外的力。

给你一个字符串dominoes表示这一行多米诺骨牌的初始状态,其中:

  • dominoes[i] = 'L',表示第i张多米诺骨牌被推向左侧,
  • dominoes[i] = 'R',表示第i张多米诺骨牌被推向右侧,
  • dominoes[i] = '.',表示没有推动第i张多米诺骨牌。

返回表示最终状态的字符串。

题目示例

示例 1 :

输入:dominoes = "RR.L" 输出:"RR.L" 解释:第一张多米诺骨牌没有给第二张施加额外的力。

示例 2 :

输入:dominoes = ".L.R...LR..L.." 输出:"LL.RR.LLRRLL.."

解题思路

  1. 问题描述
    • 给定一个表示多米诺骨牌初始状态的字符串dominoes,其中'L'表示向左倒,'R'表示向右倒,'.'表示直立。
    • 当一个骨牌倒下时,它会推动相邻的骨牌朝相同方向倒下。
    • 要求模拟所有骨牌的最终状态。
  2. 关键观察
    • 两个相邻的'L''R'之间的所有'.'会被填充为相同的方向。
    • 如果一个'R'后面跟着一个'L',则中间的'.'会从两边向中间倒下,直到相遇。
    • 边界情况可以通过添加哨兵字符('L''R')来简化处理。
  3. 算法选择
    • 使用双指针法,pre记录前一个非'.'字符的位置,i遍历当前字符。
    • 分三种情况处理:
      • s[i] == s[pre]:中间的'.'全部变为s[i]
      • s[i] == 'L' && s[pre] == 'R':中间的'.'从两边向中间倒下。
      • s[i] == 'R' && s[pre] == 'L':中间的'.'不受影响。
    • 最后去掉哨兵字符,得到结果。

题解代码

classSolution{publicStringpushDominoes(Stringdominoes){// 在原始字符串前后添加哨兵字符 'L' 和 'R',方便处理边界情况char[]s=("L"+dominoes+"R").toCharArray();intpre=0;// 记录前一个非 '.' 字符的位置(初始为哨兵 'L' 的位置)for(inti=1;i<s.length;i++){if(s[i]=='.'){continue;// 跳过当前点,继续检查下一个字符}// 情况1:当前字符与前一个非 '.' 字符相同(L...L 或 R...R)if(s[i]==s[pre]){// 将 pre 和 i 之间的所有 '.' 替换为 s[i]Arrays.fill(s,pre+1,i,s[i]);}// 情况2:当前字符是 'L' 且前一个非 '.' 字符是 'R'(R...L)elseif(s[i]=='L'){// 计算中间位置intmid=(pre+i)/2;// 如果 (pre + i) 是奇数,说明中间有一个 '.' 不需要改变// 前半部分(pre+1 到 mid)变为 'R'Arrays.fill(s,pre+1,mid+1,'R');// 后半部分(mid+1 到 i-1)变为 'L'Arrays.fill(s,mid+1,i,'L');}// 情况3:当前字符是 'R' 且前一个非 '.' 字符是 'L'(L...R)// 不需要处理,因为中间的 '.' 不受影响// 更新 pre 为当前非 '.' 字符的位置pre=i;}// 去掉首尾的哨兵字符,返回结果returnnewString(s,1,s.length-2);}}

复杂度分析

  1. 时间复杂度
    • 遍历字符串一次,时间复杂度为O(n)
    • Arrays.fill操作在最坏情况下也是O(n),但总体仍然是O(n)
  2. 空间复杂度
    • 使用了一个字符数组s,大小为O(n)
    • 其他变量为常数空间。
    • 总空间复杂度为O(n)
http://www.jsqmd.com/news/685119/

相关文章:

  • CubeMX+正点原子RGB屏终极优化:如何让LTDC刷新率稳定跑满45MHz?
  • 2026年成都托福培训TOP5机构排行 中立选型参考 - 优质品牌商家
  • 如何自动同步SQL多语言字段_通过触发器实现国际化更新
  • 基于Testbed的车载ECU软件集成测试方法研究
  • 量子计算在锕系化学模拟中的应用与优化
  • Vue 转 React:揭秘样式语言是如何被 VuReact 编译的?
  • 如何轻松下载M3U8视频?这款开源图形界面工具让你告别复杂命令行
  • 小白/程序员入门必看:收藏这份AB实验Agent实战指南,手把手教你用Claude Code快速搭建
  • 杰理AC6329C4蓝牙5.0 MCU深度评测与应用实战
  • 别再死记硬背了!华为交换机日常运维,这10条display命令搞定80%的活儿
  • 2026-04-23:树中子图的最大得分。用go语言,给定一棵无向树(共 n 个节点,编号 0 到 n-1),树的边由数组 edges 描述:edges 长度为 n-1,edges[i] = [a,
  • 国产化Docker集群部署秘籍(飞腾+麒麟+达梦组合实测):从离线安装到国密SM4镜像签名全流程
  • 手把手教你用Excel和Python双验证PEARSON相关系数,搞定毕业论文数据分析
  • 量子优化算法在作业调度中的创新应用与实现
  • 成本敏感神经网络解决不平衡分类问题
  • 【技术解析】SegNeXt:卷积注意力如何重塑语义分割新范式
  • 2026年4月河南铝艺围栏安装服务商排行盘点 - 优质品牌商家
  • Go 语言中 go install 命令的正确用法与常见误区详解
  • 3步搞定宝可梦数据合法性验证:AutoLegalityMod终极使用指南
  • 决策树失效原因与优化实战指南
  • 瑞芯微(EASY EAI)RV1126B rknn-toolkit-lite2使用方法
  • Docker边缘配置效率提升300%:基于K3s+EdgeX的7步极简部署法(附生产环境压测数据)
  • 【Luckfox Pico实战指南】从零搭建嵌入式Linux开发环境
  • Vue转React终极指南:VuReact全特性语义对照
  • C#怎么使用属性Property C#自动属性和完整属性的区别get set怎么用【基础】
  • Docker低代码配置落地白皮书(2024企业级实施框架首次公开)
  • 如何轻松实现跨平台词库迁移:深蓝词库转换工具完整指南
  • Q-Learning原理与Python实现:从基础到实战
  • 无人驾驶:名词03【Planning Trajectory:主车输出轨迹】【Prediction Trajectory:动态障碍物预测轨迹】
  • 从Wi-Fi干扰到Zigbee共存:手把手教你用频谱仪分析BLE广播信道的真实环境