golang力扣leetcode 838.推多米诺

简介: golang力扣leetcode 838.推多米诺

838.推多米诺

838.推多米诺

题解

两种解法,模拟和BFS

模拟:

可以把字符串分成很多区间

L…L

R…L

R…R

L…R

不难看出L…L和R…R的时候就是把中间的.变成L或R,而R…L就是中间相互推,而L…R不用改变,那么问题就变成了找.左右的非.,具体看代码注释

BFS:

不难看出每一次多米诺排都与上一次有关,那么就是BFS了,把L或者R的排入队,并记录他们的入队的时间和对应的方向,在BFS的时候出队,对影响的下一张牌进行入队即可,具体看代码注释

代码

package main
import (
  "bytes"
  "fmt"
)
func pushDominoes1(dominoes string) string {
  ans := []byte(dominoes)
  i, n := 0, len(ans)
  left, right := byte('L'), byte('R')
  //这里初始默认左边界为左L
  for i < n {
    j := i
    for j < n && ans[j] == '.' { //找出第一个非.的下标
      j++
    }
    if j < n {
      right = ans[j] //不是边界就是原来的值
    } else {
      right = byte('R') //如果是边界则为R
    }
    if left == right { //L...L  R...R,这种情况中间的.全都是L或者R
      for i < j {
        ans[i] = right
        i++
      }
    } else if left == 'R' && right == 'L' { //R...L,这种情况的就依次推
      k := j - 1
      for i < k {
        ans[i] = 'R'
        ans[k] = 'L'
        i++
        k--
      }
    } else { //L...R,这种情况啥事都不用干
    }
    left = right //把下一次情况的左状态赋值为这一次情况的右状态
    i = j + 1    //ans[j]肯定是非. ,所以下一次要用j+1处开始检索
    fmt.Println(string(ans))
  }
  return string(ans)
}
func pushDominoes2(dominoes string) string {
  queue := make([]int, 0)
  time := make([]int, len(dominoes))
  ans := bytes.Repeat([]byte("."), len(dominoes))
  state := make([][]byte, len(dominoes))
  for i := range time {
    time[i] = -1
  }
  for i, ch := range dominoes { //初始
    if ch != '.' {
      queue = append(queue, i)
      time[i] = 0
      state[i] = append(state[i], byte(ch))
    }
  }
  for len(queue) > 0 {
    idx := queue[0]
    queue = queue[1:]
    if len(state[idx]) > 1 {
      continue //说明同时收到左右两个力,即就是.,出队列即可
    }
    LorR := state[idx][0]
    ans[idx] = LorR //受到一个力,则赋值,下面对idx影响的下一个进行入队
    nextIdx := 0
    if LorR == byte('L') {
      nextIdx = idx - 1
    } else {
      nextIdx = idx + 1
    }
    if nextIdx >= 0 && nextIdx < len(dominoes) {
      t := time[idx]
      if time[nextIdx] == -1 { //如果第一次进入,加入队列
        queue = append(queue, nextIdx)
        time[nextIdx] = t + 1
        state[nextIdx] = append(state[nextIdx], LorR)
      } else if time[nextIdx] == t+1 { //如果不是第一个进入,说明受到了两个力,之前入过队,并且时间也记录了
        state[nextIdx] = append(state[nextIdx], LorR)
      }
    }
  }
  return string(ans)
}


目录
相关文章
|
3月前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
3月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
112 0
|
3月前
力扣(LeetCode)数据结构练习题(2)
力扣(LeetCode)数据结构练习题(2)
36 0
|
3月前
|
存储
力扣(LeetCode)数据结构练习题
力扣(LeetCode)数据结构练习题
70 0
|
6月前
2670.找出不同元素数目差数组-力扣(LeetCode)
2670.找出不同元素数目差数组-力扣(LeetCode)
49 0
|
4月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
5月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
69 6
|
5月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
137 2
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
76 1
|
4月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口