前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >2022-03-07:K 个关闭的灯泡。 N 个灯泡排成一行,编号从

2022-03-07:K 个关闭的灯泡。 N 个灯泡排成一行,编号从

原创
作者头像
福大大架构师每日一题
修改2022-03-10 09:57:32
修改2022-03-10 09:57:32
4930
举报

2022-03-07:K 个关闭的灯泡。

N 个灯泡排成一行,编号从 1 到 N 。最初,所有灯泡都关闭。每天只打开一个灯泡,直到 N 天后所有灯泡都打开。

给你一个长度为 N 的灯泡数组 blubs ,其中 bullsi = x 意味着在第 (i+1) 天,我们会把在位置 x 的灯泡打开,其中 i 从 0 开始,x 从 1 开始。

给你一个整数 K ,请你输出在第几天恰好有两个打开的灯泡,使得它们中间 正好 有 K 个灯泡且这些灯泡 全部是关闭的 。

如果不存在这种情况,返回 -1 。如果有多天都出现这种情况,请返回 最小的天数 。

力扣683。

答案2022-03-07:

时间紧,具体见代码。

代码用golang编写。代码如下:

代码语言:go
复制
package main

import (
	"fmt"
	"math"
)

func main() {
	arr := []int{1, 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
	}
}

执行结果如下:

在这里插入图片描述
在这里插入图片描述

左神java代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档