访问完所有房间的第一天
本文最后更新于 184 天前,其中的信息可能已经有所发展或是发生改变。

你需要访问 n 个房间,房间从 0 到 n - 1 编号。同时,每一天都有一个日期编号,从 0 开始,依天数递增。你每天都会访问一个房间。

最开始的第 0 天,你访问 0 号房间。给你一个长度为 n 且 下标从 0 开始 的数组 nextVisit 。在接下来的几天中,你访问房间的 次序 将根据下面的 规则 决定:

  • 假设某一天,你访问 i 号房间。
  • 如果算上本次访问,访问 i 号房间的次数为 奇数 ,那么 第二天 需要访问 nextVisit[i] 所指定的房间,其中 0 <= nextVisit[i] <= i 。
  • 如果算上本次访问,访问 i 号房间的次数为 偶数 ,那么 第二天 需要访问 (i + 1) mod n 号房间。

请返回你访问完所有房间的第一天的日期编号。题目数据保证总是存在这样的一天。由于答案可能很大,返回对 109 + 7 取余后的结果。

示例 1:

输入:nextVisit = [0,0]

输出:2

解释:

– 第 0 天,你访问房间 0 。访问 0 号房间的总次数为 1 ,次数为奇数。   下一天你需要访问房间的编号是 nextVisit[0] = 0

– 第 1 天,你访问房间 0 。访问 0 号房间的总次数为 2 ,次数为偶数。   下一天你需要访问房间的编号是 (0 + 1) mod 2 = 1

– 第 2 天,你访问房间 1 。这是你第一次完成访问所有房间的那天。

示例 2:

输入:nextVisit = [0,0,2]

输出:6

解释: 你每天访问房间的次序是 [0,0,1,0,0,1,2,…] 。 第 6 天是你访问完所有房间的第一天。

提示:

  • n == nextVisit.length
  • 2 <= n <= 105
  • 0 <= nextVisit[i] <= i

解一:(动态规划)

class Solution:
    def firstDayBeenInAllRooms(self, nextVisit):
        mod = 10**9 + 7
        dp = [0] * (len(nextVisit))

        #初始化原地待一天+访问下一个房间一天
        dp[0] = 2 
        for i in range(1, len(nextVisit)):
            to = nextVisit[i]
            dp[i] = 2 + dp[i - 1] 
            if to != 0:
                dp[i] = (dp[i] - dp[to - 1]) % mod 
            dp[i] = (dp[i] + dp[i - 1]) % mod
        return dp[len(nextVisit) - 2] # 题目保证n >= 2

解二:(前缀和优化DB)

# 存在一定问题为解决
class Solution:
    def firstDayBeenInAllRooms(self, nextVisit):
        s = [0] * len(nextVisit)
        for i, j in enumerate(nextVisit[:-1]):
            s[i + 1] = (s[i] * 2 - s[j] + 2) % 1_000_000_007
        return s[-1]

访问完所有房间的第一天 : http://116.62.240.154:9520/firstdaybeeninallrooms/
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇