LeetCode 838. 推多米诺(模拟)
文章目录
- 1. 题目
- 2. 解题
1. 题目
一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立。
在开始时,我们同时把一些多米诺骨牌向左或向右推。
每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。
同样地,倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。
如果同时有多米诺骨牌落在一张垂直竖立的多米诺骨牌的两边,由于受力平衡, 该骨牌仍然保持不变。
就这个问题而言,我们会认为正在下降的多米诺骨牌不会对其它正在下降或已经下降的多米诺骨牌施加额外的力。
给定表示初始状态的字符串 “S” 。
如果第 i 张多米诺骨牌被推向左边,则 S[i] = 'L'
;
如果第 i 张多米诺骨牌被推向右边,则 S[i] = 'R'
;
如果第 i 张多米诺骨牌没有被推动,则 S[i] = '.'
。
返回表示最终状态的字符串。
示例 1:
输入:".L.R...LR..L.."
输出:"LL.RR.LLRRLL.."示例 2:
输入:"RR.L"
输出:"RR.L"
说明:第一张多米诺骨牌没有给第二张施加额外的力。提示:
0 <= N <= 10^5
表示多米诺骨牌状态的字符串只含有 'L','R'; 以及 '.';
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/push-dominoes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 先处理两边向外倒的
- 然后记录中间的位置,用正负号区分方向
- 遍历中间间隔的左右位置的符号,分四种情况(都向左,都向右,不动,向中间倒)
class Solution {public:string pushDominoes(string dominoes) {int n = dominoes.size(), L = 0, R = n-1, l=-1, r=-1, i;while(L < n && dominoes[L] != 'R'){if(dominoes[L]=='L')l = L;//左边连续的最后一个L(中间没有遇到R)L++;}while(R >= 0 && dominoes[R] != 'L'){if(dominoes[R]=='R')r = R;//右边连续的最后一个R(中间没有遇到L)R--;}if(l != -1)//左侧存在向左倒的for(i = l-1; i >= 0; i--)dominoes[i] = 'L';if(r != -1)//右侧存在向右倒的for(i = r+1; i < dominoes.size(); i++)dominoes[i] = 'R';vector<int> pos;//中间的LR的位置记录下来for(i = L; i <= R; ++i){if(dominoes[i] == 'R')pos.push_back(i+1);//向右为+,+1为避免出现0else if(dominoes[i] == 'L')pos.push_back(-(i+1));//向左为 - }for(i = 0; i < int(pos.size())-1; ++i)//遍历中间的隔间{if(pos[i] > 0 && pos[i+1] > 0){// 右 右,中间还是右l = pos[i], r = pos[i+1]-1;while(l < r)dominoes[l++] = 'R';}else if(pos[i] < 0 && pos[i+1] < 0){ // 左, 左,中间还是左l = -pos[i], r = -pos[i+1]-1;while(l < r)dominoes[l++] = 'L';}else if(pos[i] > 0 && pos[i+1] < 0)//向中间倒{ // 左边向右,右边向左,双指针遍历l = pos[i], r = -pos[i+1]-2;while(l < r){dominoes[l++] = 'R';dominoes[r--] = 'L';}}//还有一种情况(左边向左,右边向右),中间不受影响}return dominoes;}
};
40 ms 11 MB
- 优化代码:在原字符串前面 +
L
,尾部 +R
,最后答案舍去首尾即可,可以简化代码量
class Solution {public:string pushDominoes(string dominoes) {dominoes = 'L'+dominoes+'R';int n = dominoes.size(), L = 0, R = n-1, l, r, i;vector<int> pos;//中间的LR的位置记录下来for(i = 0; i < n; ++i){if(dominoes[i] == 'R')pos.push_back(i+1);//向右为+,+1为避免出现0else if(dominoes[i] == 'L')pos.push_back(-(i+1));//向左为 - }for(i = 0; i < int(pos.size())-1; ++i)//遍历中间的隔间{if(pos[i] > 0 && pos[i+1] > 0){// 右 右,中间还是右l = pos[i], r = pos[i+1]-1;while(l < r)dominoes[l++] = 'R';}else if(pos[i] < 0 && pos[i+1] < 0){ // 左, 左,中间还是左l = -pos[i], r = -pos[i+1]-1;while(l < r)dominoes[l++] = 'L';}else if(pos[i] > 0 && pos[i+1] < 0)//向中间倒{ // 左边向右,右边向左,双指针遍历l = pos[i], r = -pos[i+1]-2;while(l < r){dominoes[l++] = 'R';dominoes[r--] = 'L';}}}return dominoes.substr(1,n-2);}
};
36 ms 12.6 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
LeetCode 838. 推多米诺(模拟)相关推荐
- Leetcode 838. 推多米诺 C++
Leetcode 838. 推多米诺 题目 一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立. 在开始时,我们同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻 ...
- 【leetcode】838. 推多米诺(模拟)
题目: 838. 推多米诺 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时,同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌.同样地,倒向右 ...
- Java实现 LeetCode 838 推多米诺(暴力模拟)
838. 推多米诺 一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立. 在开始时,我们同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌. 同样地, ...
- leetcode 838.推多米诺
题目地址(838. 推多米诺) https://leetcode-cn.com/problems/push-dominoes/ 题目描述 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时, ...
- LeetCode:838. 推多米诺————中等
题目 838. 推多米诺 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时,同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌.同样地,倒向右边 ...
- 算法题 推多米诺 模拟、队列与黑魔法
推多米诺 模拟.队列与黑魔法 题目 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时,同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌.同样地 ...
- 力扣 838. 推多米诺
题目 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时,同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌.同样地,倒向右边的多米诺骨牌也会推动 ...
- leetcode 838. Push Dominoes | 838. 推多米诺(分析每个状态)
题目 https://leetcode.com/problems/push-dominoes/ 题解 很有趣的一道题,不难,L R 的状态组合是有限的,只要分析出每个状态应该怎么处理,然后模拟就好了. ...
- 【220221】838.推多米诺
题目:https://leetcode-cn.com/problems/push-dominoes/ BFS 逻辑:元素倒下后,状态不再改变.每个元素对应唯一的倒下时间. //官方题解 class S ...
最新文章
- 让更多人能够使用Hadoop
- Shell输入输出重定向:Shell Here Document,/dev/null文件
- 140行代码实现一个逼真的大雪纷飞的效果
- 极速理解设计模式系列:22.状态模式(State Pattern)
- Android一些知识总结
- 支持向量机 - 从原理到算法的实现
- iOS-属性字符串添加下划线、删除线
- PyQt5教程 - pyqt gui编程
- Python : Arrow、Pyarrow库、以及与Julia互读
- PDF文件怎么才能编辑里面的内容
- 一次搞懂清晰度、对比度以及锐化的区别
- android开发简历,轻松拿到了阿里Android高级开发工程师的offer
- onfocus获取焦点事件与onblur失去焦点事件
- 在一个循环链队中只有尾指针(记为rear,结点结构为数据域data,指针域next),请给出这种队列的入队和出队操作的实现过程。
- 第三方支付机构是如何产生的?有着怎样的历史背景?它的未来又该如何去走得更加辉煌?
- 1.5黄金白银最新行情走势分析预测,黄金实时操作建议
- 【Eclipse报错】Faceted Project Problem:Target runtime Apache Tomcat v8.0 is not defined.
- ceph块存储的创建
- 计算用户输入的日期离1900年1月1日相距多少天
- 安全基础——常见网络安全产品
热门文章
- Django后台管理之商品分类
- 串口之GetCommState、SetCommState函数详解
- 【笔记目录1】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总
- 让Windows7 x64 IIS7支持32位应用程序
- python迭代-如何对迭代器做切片操作
- 接口测试工具-fiddler的运用
- [转载]我的WafBypass之道(upload篇)
- CodeForces - 796D Police Stations bfs
- 可视化工具Navicat for MySQL-操作三
- 【Github教程】史上最全github用法:github入门到精通