zoukankan      html  css  js  c++  java
  • 838. Push Dominoes

    There are N dominoes in a line, and we place each domino vertically upright.

    In the beginning, we simultaneously push some of the dominoes either to the left or to the right.

    After each second, each domino that is falling to the left pushes the adjacent domino on the left.

    Similarly, the dominoes falling to the right push their adjacent dominoes standing on the right.

    When a vertical domino has dominoes falling on it from both sides, it stays still due to the balance of the forces.

    For the purposes of this question, we will consider that a falling domino expends no additional force to a falling or already fallen domino.

    Given a string "S" representing the initial state. S[i] = 'L', if the i-th domino has been pushed to the left; S[i] = 'R', if the i-th domino has been pushed to the right; S[i] = '.', if the i-th domino has not been pushed.

    Return a string representing the final state. 

    Example 1:

    Input: ".L.R...LR..L.."
    Output: "LL.RR.LLRRLL.."
    

    Example 2:

    Input: "RR.L"
    Output: "RR.L"
    Explanation: The first domino expends no additional force on the second domino.

    Note:

    1. 0 <= N <= 10^5
    2. String dominoes contains only 'L', 'R' and '.'

    Approach #1: Two pointer. [C++]

    class Solution {
    public:
        string pushDominoes(string dominoes) {
            dominoes = 'L' + dominoes + 'R';
            int len = dominoes.length();
            string res = "";
            
            for (int i = 0, j = 1; j < len; ++j) {
                if (dominoes[j] == '.') continue;
                int mid = j - i - 1;
                if (i > 0) res += dominoes[i];
                if (dominoes[i] == dominoes[j]) 
                    res += string(mid, dominoes[i]);
                else if (dominoes[i] == 'L' && dominoes[j] == 'R')
                    res += string(mid, '.');
                else
                    res += string(mid/2, 'R') + string(mid%2, '.') + string(mid/2, 'L');
                i = j;
            }
            
            return res;
        }
    };
    

      

    Analysis:

    we define two pointers which represent the last and the current dominoes we pushed. There are four situations:

    1. L.....L: all dominoes will be pushed to left.

    2. R....R: all dominoes will be pushed to right.

    3. L....R: all dominoes won't be pushed to right or left.

    4. R....L: the left half dominoes will be pushed to right and the right half will pushed to left. if the number of dominoes is odd, the middle position will be a '.'.

    Reference:

    https://leetcode.com/problems/push-dominoes/discuss/132332/C%2B%2BJavaPython-Two-Pointers

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    解决 Android SDK Manager不能下载旧版本的sdk的问题
    [置顶] 如何合并文件中的内容?
    JSTL解析——005——core标签库04
    C中的几组指针
    别动我的奶酪:CSV文件数据丢零现象及对策
    重载(overload),覆盖/重写(override),隐藏(hide)
    IOS 轻量级数据持久化 DataLite
    记录路径dp-4713-Permutation
    android 多媒体数据库详解
    Data Recovery Advisor(数据恢复顾问)
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10580952.html
Copyright © 2011-2022 走看看