LeetCode 1997.访问完所有房间的第一天:动态规划(DP)——4行主要代码(不需要什么前缀和)

【LetMeFly】1997.访问完所有房间的第一天:动态规划(DP)——4行主要代码(不需要什么前缀和)

力扣题目链接:https://leetcode.cn/problems/first-day-where-you-have-been-in-all-the-rooms/

你需要访问 n 个房间,房间从 0n - 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 天是你访问完所有房间的第一天。

示例 3:

输入:nextVisit = [0,1,2,0]
输出:6
解释:
你每天访问房间的次序是 [0,0,1,1,2,2,3,...] 。
第 6 天是你访问完所有房间的第一天。

 

提示:

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

解题方法:动态规划(DP)

题目中明确说明了0 <= nextVisit[i] <= i,也就是说每个房间第一次访问都会“往前回退”到nextVisit[i]而不会访问新的房间,而第二次访问则会访问到“相邻的下一个房间”。

因此我们可以使用一个firstVisit数组,其中firstVisit[i]代表房间i第一次被访问时的天数。

那么,由房间i访问到房间i + 1需要多久呢?

  • 首先需要花费一天访问到nextVisit[i]这个房间(记为j
  • 接着需要花费firstVisit[i] - firstVisit[j]天再一次地由j访问到i
  • 最后再花费一天由i访问到i + 1

因此首次访问到房间i + 1的天数为firstVisit[i] + 1 + (firstVisit[i] - firstVisit[j]) + 1 = 2 * firstVisit[i] - firstVisit[j] + 2

从房间1开始往后遍历到最后一间房间,则firstVisit.back()记为答案。

时空复杂度

  • 时间复杂度 O ( l e n ( n e x t V i s i t ) ) O(len(nextVisit)) O(len(nextVisit))
  • 空间复杂度 O ( l e n ( n e x t V i s i t ) ) O(len(nextVisit)) O(len(nextVisit))。其实不难发现nextVisit数组中每个值只会用到一次,因此若将firstVisit保存在nextVisit数组中则可以以 O ( 1 ) O(1) O(1)的空间复杂度实现。

AC代码

C++
typedef long long ll;
const ll MOD = 1e9 + 7;
class Solution {
public:int firstDayBeenInAllRooms(vector<int>& nextVisit) {vector<ll> firstVisit(nextVisit.size());for (int i = 1; i < nextVisit.size(); i++) {firstVisit[i] = (firstVisit[i - 1] * 2 - firstVisit[nextVisit[i - 1]] + 2 + MOD) % MOD;  // 记得先加个MOD再对MOD取模,否则可能是负结果。}return firstVisit.back();}
};
Python
from typing import Listclass Solution:def firstDayBeenInAllRooms(self, nextVisit: List[int]) -> int:firstVisit = [0] * len(nextVisit)for i in range(1, len(nextVisit)):firstVisit[i] = (firstVisit[i - 1] * 2 - firstVisit[nextVisit[i - 1]] + 2 + 1_000_000_007) % 1_000_000_007return firstVisit[-1]

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/137119523

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/778104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAX 来构建一个基本的人工神经网络(ANN)进行分类任务

import jax.numpy as jnp from jax import grad, jit, vmap from jax import random from jax.experimental import optimizers from jax.nn import relu, softmax# 构建神经网络模型 def neural_network(params, x):for W, b in params:x jnp.dot(x, W) bx relu(x)return s…

Flask学习(六):蓝图(Blueprint)

蓝图&#xff08;Blueprint&#xff09;&#xff1a;将各个业务进行区分&#xff0c;然后每一个业务单元可以独立维护&#xff0c;Blueprint可以单独具有自己的模板、静态文件或者其它的通用操作方法&#xff0c;它并不是必须要实现应用的视图和函数的。 Demo目录结构&#xf…

常见panic场景 (空指针、越界、断言、map相关panic)

在Go语言中&#xff0c;panic是一个内建函数&#xff0c;用于在遇到无法继续执行的错误条件时中断当前函数的执行。panic可以由开发者显式调用&#xff0c;也可能由运行时错误触发。以下是一些常见的panic场景&#xff1a; 空指针解引用 当尝试通过一个nil指针访问其指向的值时…

linux离线安装jenkins及使用教程

本教程采用jenkins.war的方式离线安装部署&#xff0c;在线下载的方式会遇到诸多问题&#xff0c;不宜采用 一、下载地址 地址&#xff1a;Jenkins download and deployment 下载最新的长期支持版 由于jenkins使用java开发的&#xff0c;所以需要安装的linux服务器装有jdk环…

插入排序、归并排序、堆排序和快速排序的稳定性分析

插入排序、归并排序、堆排序和快速排序的稳定性分析 一、插入排序的稳定性二、归并排序的稳定性三、堆排序的稳定性四、快速排序的稳定性总结在计算机科学中,排序是将一组数据按照特定顺序进行排列的过程。排序算法的效率和稳定性是评价其优劣的两个重要指标。稳定性指的是在排…

新版Idea2023.3.5与lombok冲突、@Data失效

新版idea和lombok冲突&#xff0c;加上Data&#xff0c;其他地方get set也不报错&#xff0c;但是一运行就找不到get set方法。 但是直接使用Getter和Setter可以访问、应该是Data失效了。 解决方法&#xff1a; 看推上介绍是 lombok 与 idea 采集 get 、set 方法的时候所用的技…

maya pycharm运行 重定向

目录 maya sdk下载: maya测试代码: 添加sdk 依赖库: pycharm连接 maya 测试ok

day7|错误恢复

其实就是由于越界等问题所导致的panic,我们该如何解决 文中提到了两个方法&#xff0c;一种是使用defer&#xff0c;推迟错误的执行 第二种&#xff1a;recover函数 &#xff08;需要在defer里面生效&#xff09;可以避免panic生效而导致整个函数终止 package mainimport &q…

使用 Qlib 在线模式

使用 Qlib 在线模式 简介 Qlib 文档中介绍了离线模式。除此之外,用户还可以使用 Qlib 的在线模式。 在线模式旨在解决以下问题: 集中管理数据,用户无需管理不同版本的数据。减少生成的缓存量。使数据可以远程访问。在在线模式下,Qlib 会通过 Qlib-Server 以集中方式管理…

Jupyter开启远程服务器(最新版)

Jupyter Notebook 在本地进行访问时比较简单&#xff0c;直接在cmd命令行下输入 jupyter notebook 即可&#xff0c;然而notebook的作用不止于此&#xff0c;还可以用于远程连接服务器&#xff0c;这样如果你有一台服务器内存很大&#xff0c;但是呢你又不喜欢在linux上进行操作…

【C语言】编译和链接----预处理详解【图文详解】

欢迎来CILMY23的博客喔&#xff0c;本篇为【C语言】文件操作揭秘&#xff1a;C语言中文件的顺序读写、随机读写、判断文件结束和文件缓冲区详细解析【图文详解】&#xff0c;感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 前言 欢迎来到本篇博客&…

如何备考2025年AMC8竞赛?吃透2000-2024年600道真题(免费送题)

最近有家长朋友问我&#xff0c;现在有哪些类似于奥数的比赛可以参加&#xff1f;我的建议可以关注下AMC8的竞赛&#xff0c;类似于国内的奥数&#xff0c;但是其难度要比国内的奥数低一些&#xff0c;而且比赛门槛更低&#xff0c;考试也更方便。比赛的题目尤其是应用题比较有…

78.子集90.子集2

78.子集 思路 又回到了组合的模板中来&#xff0c;这道题相比于前面的题省去了递归终止条件。大差不差。 代码 class Solution {List<List<Integer>> result new ArrayList<>();LinkedList<Integer> listnew LinkedList<>();public List<…

Redis开源协议变更!Garnet:微软开源代替方案?

Garnet&#xff1a;微软开源的高性能替代方案&#xff0c;秉承兼容 RESP 协议的同时&#xff0c;以卓越性能和无缝迁移能力重新定义分布式缓存存储&#xff01; - 精选真开源&#xff0c;释放新价值。 概览 最近&#xff0c;Redis修改了开源协议&#xff0c;从BSD变成了 SSPLv…

第二十一章 Jquery ajax

文章目录 1. jquery下载2. jquery的使用3. jquery页面加载完毕执行4. jquery属性控制6. 遍历器 2. ajax1. 准备后台服务器2. ajax发送get请求3. ajax发送post请求 1. jquery下载 点击下载 稳定版本1.9 2. jquery的使用 存放到html文件的同级目录 3. jquery页面加载完毕执行…

Unity | 射线检测及EventSystem总结

目录 一、知识概述 1.Input.mousePosition 2.Camera.ScreenToWorldPoint 3.Camera.ScreenPointToRay 4.Physics2D.Raycast 二、射线相关 1.3D&#xff08;包括UI&#xff09;、射线与ScreenPointToRay 2.3D&#xff08;包括UI&#xff09;、射线与ScreenToWorldPoint …

Linux安装redis(基于CentOS系统,Ubuntu也可参考)

前言&#xff1a;本文内容为实操记录&#xff0c;仅供参考&#xff01; 一、下载并解压Redis 1、执行下面的命令下载redis&#xff1a;wget https://download.redis.io/releases/redis-6.2.6.tar.gz 2、解压redis&#xff1a;tar xzf redis-6.2.6.tar.gz 3、移动redis目录&a…

【QT学习笔记】qt配置快捷键:全局快捷键|应用程序中的快捷键

在Qt Creator中配置快捷键&#xff0c;可以通过以下步骤进行&#xff1a; 配置全局快捷键&#xff08;适用于整个IDE的操作&#xff09;&#xff1a; 1. **打开快捷键设置**&#xff1a; - 打开Qt Creator&#xff0c;点击顶部菜单栏的“工具”(Tools)。 - 在下拉菜单中…

“直播曝光“有哪些媒体直播分流资源?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 我们线下举办活动时&#xff0c;往往希望活动进行更大的曝光&#xff0c;随着视频直播越来越被大众认可&#xff0c;甚至成了活动的标配&#xff0c;那么做活动视频直播的时候&#xff0…

通俗易懂:举例说明什么情况会导致Java堆内存溢出。

Java堆内存溢出通常发生在以下几种典型场景中&#xff1a; 1. 无限制的对象创建 - 当程序中的某个循环或者其他逻辑不断地创建新的对象&#xff0c;而这些对象在每次迭代完成后并没有被垃圾回收器(GC)回收&#xff0c;随着时间推移&#xff0c;持续累积的对象会耗尽堆内存。例如…