LeetCode-838 推多米诺

简介: LeetCode-838 推多米诺

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/push-dominoes

题目描述

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.."

 

提示:

n == dominoes.length
1 <= n <= 105
dominoes[i] 为 'L'、'R' 或 '.'

解题思路

很需要逻辑的一道题。可以对每一块多米诺牌进行受力分析,首先从右往左遍历,用viRight记录第i张牌受到的向左的力优先级,数字越小说明力越大,如果数字为0则表示没有受到力。然后从左往右依次遍历多米诺牌,判断向右的力的优先级,与向左的力优先级进行比较,对于树立的多米诺牌,更改多米诺牌的状态。

代码展示

 

class Solution {
public:
    string pushDominoes(string dominoes) {
        vector<int> viRight(dominoes.size(), 0);
        int iTemp = 0;
        for (int i = dominoes.size() - 1; i >= 0; i--)
        {
            if (dominoes[i] == 'L')
            {
                iTemp = 1;
            }
            else if (dominoes[i] == 'R')
            {
                iTemp = 0;
            }
            else
            {
                if (iTemp)
                    iTemp++;
            }
            viRight[i] = iTemp;
        }
        iTemp = 0;
        for (int i = 0; i < dominoes.size(); i++)
        {
            if (dominoes[i] == 'R')
            {
                iTemp = 1;
            }
            else if (dominoes[i] == 'L')
            {
                iTemp = 0;
            }
            else
            {
                if (iTemp)
                    iTemp++;
            }
            if (dominoes[i] == '.')
            {
                if (viRight[i]!= 0 && iTemp > viRight[i] || !iTemp && viRight[i])
                {
                    dominoes[i] = 'L';
                }
                else if (iTemp != 0 && iTemp < viRight[i] || !viRight[i] && iTemp)
                {
                    dominoes[i] = 'R';
                }
            }
        }
        return dominoes;
    }
};

运行结果

 

相关文章
【 腾讯精选练习 50 题】14—合并两个有序数组【简单】
【 腾讯精选练习 50 题】14—合并两个有序数组【简单】
|
Java C++ Python
快讯:LeetCode中国正式上线《剑指Offer》题目,刷题真方便了!
近日,LeetCode中国[1]上线了一个全新的分类模块 LCOF “剑指 Offer[2]”。
4017 0
快讯:LeetCode中国正式上线《剑指Offer》题目,刷题真方便了!
|
4天前
每日一题!如约而至!(图片整理,寻找数组的中心下标)
每日一题!如约而至!(图片整理,寻找数组的中心下标)
16 0
|
4天前
leetcode-838:推多米诺
leetcode-838:推多米诺
24 0
|
6月前
|
算法 网络架构
代码随想录算法训练营第三十三天 | LeetCode 1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果
代码随想录算法训练营第三十三天 | LeetCode 1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果
33 0
|
9月前
当前年-往后推5年
当前年-往后推5年
25 0
|
12月前
|
算法 C++ Python
【每日算法Day 96】腾讯面试题:合并两个有序数组
【每日算法Day 96】腾讯面试题:合并两个有序数组
|
定位技术
leetcode每日一题:455. 分发饼干
leetcode每日一题:455. 分发饼干
|
消息中间件 存储 设计模式
我要实现一个推单功能了
以前都是作为消息接收方,接收消息。记得当时做支付的时候,接收第三方支付公司的各种消息,如支付成功、支付失败、退款成功、退款失败。