ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

广搜学习(LeetCode 838)

2022-02-22 09:06:18  阅读:142  来源: 互联网

标签:多米诺骨牌 int 838 dmn next 学习 dominoes LeetCode dir


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…”

思路:因为推倒骨牌是一个行为传导的行为,因此可以使用广搜。先将所有不为 ’ . ’ 的字符入队。队列存储的内容为:字符位置、修改时间、字符推动的方向。当有 ’ . ’ 左右都受力的时候,需要将骨牌恢复到竖直状态

class Solution {
    public String pushDominoes(String dominoes) {
        char[] dmn = dominoes.toCharArray();
        int len = dmn.length;
        int[] recordTime = new int[len];
        Deque<int[]> queue = new LinkedList<>();
        for(int i = 0; i < len; i++){
            if(dmn[i] == '.')
                continue;
            int dir = dmn[i] == 'L' ? -1 : 1;
            queue.add(new int[]{i,1,dir});
            recordTime[i] = 1;
        }
        while(!queue.isEmpty()){
            int[] pos = queue.pollFirst();
            int loc = pos[0],time = pos[1],dir = pos[2];
            int next = loc + dir;
            //如果当前的字符为 ' . ' 则属于左右都受力后恢复为竖立状态,直接跳过本次循环
            if(dmn[loc] == '.' || (next < 0 || next >= len))
                continue;
            if(recordTime[next] == 0){
                queue.addLast(new int[]{next,time+1,dir});
                dmn[next] = dir == -1 ? 'L' : 'R';
                recordTime[next] = time + 1;
            }else if(recordTime[next] == time + 1){
                dmn[next] = '.';
            }
        }
        return String.valueOf(dmn);
    }
}

标签:多米诺骨牌,int,838,dmn,next,学习,dominoes,LeetCode,dir
来源: https://blog.csdn.net/hxxx1314/article/details/123059987

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有