题目:https://leetcode-cn.com/problems/push-dominoes/

BFS

逻辑:元素倒下后,状态不再改变。每个元素对应唯一的倒下时间。

//官方题解
class Solution {public String pushDominoes(String dominoes) {int n = dominoes.length();Deque<Integer> queue = new ArrayDeque<Integer>();int[] time = new int[n];Arrays.fill(time, -1);List<Character>[] force = new List[n];for (int i = 0; i < n; i++) {force[i] = new ArrayList<Character>();}//初始入队:正在倒下的元素for (int i = 0; i < n; i++) {char f = dominoes.charAt(i);if (f != '.') {queue.offer(i);time[i] = 0;force[i].add(f);}}//char数组便于字符串替换char[] res = new char[n];Arrays.fill(res, '.');while (!queue.isEmpty()) {int i = queue.poll();//【巧妙】只受到一个力才会倒//受力有且仅有两种,时间只会先后或同时//先后:后作用力不会施加于已有作用力的元素//同时:元素出队时,已到下一时间,力皆作用完毕if (force[i].size() == 1) {char f = force[i].get(0);res[i] = f;//根据力的方向确定下一个倒下的元素niint ni = f == 'L' ? i - 1 : i + 1;//元素在数组范围内if (ni >= 0 && ni < n) {int t = time[i];if (time[ni] == -1) {//根据倒下时间筛选,未确定时间的入队queue.offer(ni);//入队后再确定时间time[ni] = t + 1;force[ni].add(f);} else if (time[ni] == t + 1) { //同时force[ni].add(f);}}}}return new String(res);}
}

双指针

转化:【区间问题】
区间:两端both为正在倒下的骨牌,它们包裹着若干个竖立的骨牌
状态:

  • 如果两边的骨牌同向,那么这段连续的竖立骨牌会倒向同一方向。
  • 如果两边的骨牌相对,那么这段骨牌会向中间倒。
  • 如果两边的骨牌相反,那么这段骨牌会保持竖立。

编程技巧:给dominoes最左边添加一个“L”,最右边添加一个“R”

//官方题解
class Solution {public String pushDominoes(String dominoes) {char[] s = dominoes.toCharArray();int n = s.length, i = 0;//【巧妙】不直接扩大dominoes,而是单独设区间端点left='L'char left = 'L';while (i < n) {int j = i;//找右端点:滤去中间竖立骨牌while (j < n && s[j] == '.') { // 找到一段连续的没有被推动的骨牌j++;}//【巧妙】不直接扩大dominoes,而是单独设区间端点right='R'char right = j < n ? s[j] : 'R';//判断区间两端方向if (left == right) { // 方向相同,那么这些竖立骨牌也会倒向同一方向while (i < j) {s[i++] = right;}} else if (left == 'R' && right == 'L') { // 方向相对,那么就从两侧向中间倒int k = j - 1;while (i < k) {s[i++] = 'R';s[k--] = 'L';}}//迭代下个区间left = right;i = j + 1;}return new String(s);}
}

【220221】838.推多米诺相关推荐

  1. leetcode 838.推多米诺

    题目地址(838. 推多米诺) https://leetcode-cn.com/problems/push-dominoes/ 题目描述 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时, ...

  2. LeetCode:838. 推多米诺————中等

    题目 838. 推多米诺 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时,同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌.同样地,倒向右边 ...

  3. 【leetcode】838. 推多米诺(模拟)

    题目: 838. 推多米诺 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时,同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌.同样地,倒向右 ...

  4. Leetcode 838. 推多米诺 C++

    Leetcode 838. 推多米诺 题目 一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立. 在开始时,我们同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻 ...

  5. Java实现 LeetCode 838 推多米诺(暴力模拟)

    838. 推多米诺 一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立. 在开始时,我们同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌. 同样地, ...

  6. LeetCode 838. 推多米诺(模拟)

    文章目录 1. 题目 2. 解题 1. 题目 一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立. 在开始时,我们同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相 ...

  7. 力扣 838. 推多米诺

    题目 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时,同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌.同样地,倒向右边的多米诺骨牌也会推动 ...

  8. leetcode 838. Push Dominoes | 838. 推多米诺(分析每个状态)

    题目 https://leetcode.com/problems/push-dominoes/ 题解 很有趣的一道题,不难,L R 的状态组合是有限的,只要分析出每个状态应该怎么处理,然后模拟就好了. ...

  9. 算法题 推多米诺 模拟、队列与黑魔法

    推多米诺 模拟.队列与黑魔法 题目 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时,同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌.同样地 ...

最新文章

  1. 操作系统三: 地址空间与地址生成
  2. 【Python】 linux中python命令的命令行参数
  3. head rush ajax chapter1 Ajax
  4. c语言 数组指针,C语言数组名及指向数组指针的小结
  5. .net函数查询_特来电智能分析平台动态查询架构创新实践
  6. 仅用 2 年过渡到自研 ARM 芯片,苹果的底气从何而来?
  7. mysql安装显示3534_MySQL安装成功之后启动错误 3534、28000和简单使用
  8. 安装nginx的过程
  9. 【转载】如何做个好员工?
  10. 20200701:力扣194周周赛上
  11. Codeforces 71A Way Too Long Words
  12. 悟空crm开源版本环境搭建
  13. 热血江湖辅助代码编写教程(价值500
  14. POJ 2079 求最大三角形面积
  15. 面试时如何回答离开上家公司的原因?
  16. mathtype中如何添加一个圆圈中间一个减号的符号
  17. centos 日志审计_生产环境日志审计
  18. 微服务架构的基础框架选择
  19. 零代码平台在大型企业的进化之路
  20. 584. 寻找用户推荐人

热门文章

  1. 119、基于51单片机温湿度光照强度仿真设计
  2. “卓越需求分析与管理最佳实践” 培训班
  3. 批量插入1000w条数据
  4. 捂碳星球|换季了,那些不穿的衣服,你都怎么处理了?
  5. iOS11 自定义UIBarButtonItem显示异常解决方案
  6. Java多线程学习之wait、notify/notifyAll 详解
  7. uNo面板L灯一直闪_鲁公讲家装:三联开关控制三个灯怎么接线,基本知识要知道...
  8. 转载:使用Spring进行数据访问(Data Access With Spring)
  9. Arm通用计时器简介
  10. TYPE-C接口电路设计篇(二)