2022-03-07:K 个关闭的灯泡。 N 个灯泡排成一行,编号从 1 到 N 。最初,所有灯泡都关闭。每天只打开一个灯泡,直到 N 天后所有灯泡都打开。 给你一个长度为 N 的灯泡数组 blubs
Posted 福大大架构师每日一题
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-03-07:K 个关闭的灯泡。 N 个灯泡排成一行,编号从 1 到 N 。最初,所有灯泡都关闭。每天只打开一个灯泡,直到 N 天后所有灯泡都打开。 给你一个长度为 N 的灯泡数组 blubs相关的知识,希望对你有一定的参考价值。
2022-03-07:K 个关闭的灯泡。
N 个灯泡排成一行,编号从 1 到 N 。最初,所有灯泡都关闭。每天只打开一个灯泡,直到 N 天后所有灯泡都打开。
给你一个长度为 N 的灯泡数组 blubs ,其中 bulls[i] = x 意味着在第 (i+1) 天,我们会把在位置 x 的灯泡打开,其中 i 从 0 开始,x 从 1 开始。
给你一个整数 K ,请你输出在第几天恰好有两个打开的灯泡,使得它们中间 正好 有 K 个灯泡且这些灯泡 全部是关闭的 。
如果不存在这种情况,返回 -1 。如果有多天都出现这种情况,请返回 最小的天数 。
力扣683。
答案2022-03-07:
时间紧,具体见代码。
代码用golang编写。代码如下:
package main
import (
"fmt"
"math"
)
func main()
arr := []int1, 3, 2
k := 1
ret := kEmptySlots2(arr, k)
fmt.Println(ret)
func kEmptySlots2(bulbs []int, k int) int
n := len(bulbs)
days := make([]int, n)
for i := 0; i < n; i++
days[bulbs[i]-1] = i + 1
ans := math.MaxInt64
for left, mid, right := 0, 1, k+1; right < n; mid++
// 验证指针mid
// mid 永远不和left撞上的!
// 1) mid在left和right中间验证的时候,没通过!
// 2) mid是撞上right的时候
if days[mid] <= getMax(days[left], days[right])
if mid == right // 收答案!
ans = getMin(ans, getMax(days[left], days[right]))
left = mid
right = mid + k + 1
if ans == math.MaxInt64
return -1
else
return ans
func getMax(a, b int) int
if a > b
return a
else
return b
func getMin(a, b int) int
if a < b
return a
else
return b
执行结果如下:
以上是关于2022-03-07:K 个关闭的灯泡。 N 个灯泡排成一行,编号从 1 到 N 。最初,所有灯泡都关闭。每天只打开一个灯泡,直到 N 天后所有灯泡都打开。 给你一个长度为 N 的灯泡数组 blubs的主要内容,如果未能解决你的问题,请参考以下文章