来源:力扣(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; } };
运行结果