leetcode-838:推多米诺

  • 题目
  • 解题
    • 方法一:BFS
    • 方法二:双指针(模拟)

题目

题目链接
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.."

解题

方法一:BFS

参考链接
由于题目的意思,每1秒,就会有一个会倒,因此可以使用BFS,每一层时间相同,给下一个时刻,施加力,如果该时刻受力平衡(2个力)就忽略,受力不平衡(1个力)就继续传递。

class Solution {public:string pushDominoes(string dominoes) {int n=dominoes.size();queue<int> q;vector<int> time(n,-1);//记录时间,未访问的为-1vector<string> force(n);//记录力,(每个点最多只会有2个力)for(int i=0;i<n;i++){if(dominoes[i]!='.'){q.push(i);time[i]=0;force[i].push_back(dominoes[i]);}}string res(n,'.');while(!q.empty()){int i=q.front();q.pop();if(force[i].size()==1){//只有 只到受一个力的 才会继续进行。 如果受到2个力,说明平衡,直接忽略char f=force[i][0];//当前的 力res[i]=f;int ni=f=='L'?i-1:i+1;//下一个索引 next indexif(ni>=0&&ni<n){if(time[ni]==-1){//如果下一个点未访问过q.push(ni);time[ni]=time[i]+1;force[ni].push_back(f);}else if(time[ni]==time[i]+1){//如果下一个点访问过,且时间一致,说明受力平衡force[ni].push_back(f);}}}}return res;}
};

方法二:双指针(模拟)

1、LL之间的全L
2、RR之间的全R
3、LR不变
4、RL中间靠
5、最左边默认有个L,最右边默认有个R,这样方便处理

class Solution {public:string pushDominoes(string dominoes) {dominoes='L'+dominoes+'R';string res;int l=0,r=1;//通过双指针,处理两指针中间的'.'while(r<dominoes.size()){while(r<dominoes.size()&&dominoes[r]=='.') r++;char leftChar=dominoes[l];char rightChar=dominoes[r];if(leftChar==rightChar){//情况1、2for(int i=l+1;i<r;i++){res+=leftChar;}}else if(leftChar=='R'){//情况4:RL中间靠for(int i=0;i<(r-l-1)>>1;i++) res+='R';if(((r-l-1)&1)==1) res+='.';for(int i=0;i<(r-l-1)>>1;i++) res+='L';}else{//情况3:LR不变for(int i=l+1;i<r;i++) res+='.';}res+=rightChar;l=r;r++;}return res.substr(0,res.size()-1);}
};

leetcode-838:推多米诺相关推荐

  1. Leetcode 838. 推多米诺 C++

    Leetcode 838. 推多米诺 题目 一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立. 在开始时,我们同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻 ...

  2. leetcode 838.推多米诺

    题目地址(838. 推多米诺) https://leetcode-cn.com/problems/push-dominoes/ 题目描述 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时, ...

  3. Java实现 LeetCode 838 推多米诺(暴力模拟)

    838. 推多米诺 一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立. 在开始时,我们同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌. 同样地, ...

  4. LeetCode 838. 推多米诺(模拟)

    文章目录 1. 题目 2. 解题 1. 题目 一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立. 在开始时,我们同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相 ...

  5. LeetCode:838. 推多米诺————中等

    题目 838. 推多米诺 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时,同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌.同样地,倒向右边 ...

  6. 【leetcode】838. 推多米诺(模拟)

    题目: 838. 推多米诺 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时,同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌.同样地,倒向右 ...

  7. 力扣 838. 推多米诺

    题目 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时,同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌.同样地,倒向右边的多米诺骨牌也会推动 ...

  8. leetcode 838. Push Dominoes | 838. 推多米诺(分析每个状态)

    题目 https://leetcode.com/problems/push-dominoes/ 题解 很有趣的一道题,不难,L R 的状态组合是有限的,只要分析出每个状态应该怎么处理,然后模拟就好了. ...

  9. 【220221】838.推多米诺

    题目:https://leetcode-cn.com/problems/push-dominoes/ BFS 逻辑:元素倒下后,状态不再改变.每个元素对应唯一的倒下时间. //官方题解 class S ...

  10. 算法题 推多米诺 模拟、队列与黑魔法

    推多米诺 模拟.队列与黑魔法 题目 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时,同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌.同样地 ...

最新文章

  1. Windows:让Windows XP中的IIS支持多站点的工具
  2. js关闭手机浏览器_Unity 之 WebGL打开手机摄像头
  3. 分布式服务管理框架-Zookeeper节点ACL
  4. 【火炉炼AI】机器学习013-用朴素贝叶斯分类器估算个人收入阶层
  5. 1月17日学习内容整理:Scrapy框架补充之pipeline,去重规则
  6. Java——匿名内部类实现线程的两种方式
  7. Hive 整合 HBase
  8. 第 17 章 垃圾回收器
  9. (二)MR之reduce多目录输出
  10. 如何将txt中的数据整理到Matlab中画图
  11. 微信公众号unionid问题
  12. android蓝牙hid 鼠标,BLE HID协议-----蓝牙鼠标代码流分析
  13. Mars3D开发基础学习:场景特效
  14. Android 实现点击输入框以外的区域隐藏软键盘
  15. 关于计算机算法的ppt,中科院计算机算法分析与设计_习题3-4_答案.ppt
  16. 从多个Word文件中取值到Excel中,整理文件的神器,Word精灵V7.3
  17. Zabbix监控平台部署+监控客户端
  18. 域名升级访问中拿笔记好_域名选择与老域名质量评分,尽量少踩坑
  19. 怎么吃才能促进孩子长个子?
  20. Java中IO流(3).

热门文章

  1. 2022海南最新消防设施操作员模拟考试试题及答案
  2. [UOJ198][CTSC2016]时空旅行
  3. 第八届“图灵杯”NEUQ—ACM程序设计竞赛个人赛(同步赛)
  4. TCP的核心系列 — SACK和DSACK的实现(六)
  5. VGA、DVI、HDMI、DP 接口介绍及优劣
  6. 12306 APP 同一乘客、同列火车候补订单与硬座的处理规则!
  7. 正好配资复盘观点:上证第一支撑位3426
  8. 饮料如何畅销市场?看农夫山泉如何玩转营销
  9. ASPX一句话木马详细分析
  10. 全国计算机一级选择题免费,全国计算机一级考试选择题试题与详细答案