推多米诺——双指针

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

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

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

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

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

dominoes[i] = ‘L’,表示第 i 张多米诺骨牌被推向左侧,
dominoes[i] = ‘R’,表示第 i 张多米诺骨牌被推向右侧,
dominoes[i] = ‘.’,表示没有推动第 i 张多米诺骨牌。
返回表示最终状态的字符串。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/push-dominoes

思路
模拟+同向双指针
假设序列的最左侧有一个L,序列的最右侧有一个R
依次分析每一对序列之间的状态
LL之间的全部向左倒
RR之间的全部向右倒
LR之间的不受影响
RL之间的左侧的向右倒,右侧的向左倒

代码

class Solution {
public:
    string pushDominoes(string dominoes) {

        char left='L';
        int n=dominoes.size();
        char right;

        int i=0;

        while(i<n){

            int j=i;
            while(i<n&&dominoes[i]=='.') i++;   // 找到序列的右端点状态
            if(i<n)
            right=dominoes[i];
            else
            right='R';
            if(left==right){
                while(j<i) dominoes[j++]=left;
            }else if(left=='R'&&right=='L'){
                int k=i-1;       // 防止下标越界
                while(j<k){
                    dominoes[j++]=left;
                    dominoes[k--]=right;
                }
            }
            left=right;        // 上一阶段的右节点变为下一阶段的左节点
            i++;
        }

        return dominoes;

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值