LeetCode 1652: 拆炸弹 (Defuse the Bomb)超详细解释

LeetCode 1652: 拆炸弹 (Defuse the Bomb)

题目描述

你有一个炸弹需要拆除,时间紧迫!你的情报员会给你一个长度为 n循环 数组 code 以及一个密钥 k

为了获得正确的密码,你需要替换掉每一个数字。所有数字会 同时 被替换。

  • 如果 k > 0 ,将第 i 个数字用 接下来 k 个数字之和 替换。
  • 如果 k < 0 ,将第 i 个数字用 之前 k 个数字之和 替换。
  • 如果 k == 0 ,将第 i 个数字用 0 替换。

由于 code 是循环的:

  • code[n-1] 的下一个元素是 code[0]
  • code[0] 的前一个元素是 code[n-1]

给你 循环数组 code 和整数密钥 k ,请你返回解密后的结果来拆除炸弹!


示例

示例 1

输入:
code = [5,7,1,4], k = 3

输出:
[12,10,16,13]

解释:
每个数字都被接下来 3 个数字之和替换,解密后的密码为 [7+1+4, 1+4+5, 4+5+7, 5+7+1]
注意数组是循环连接的。

示例 2

输入:
code = [1,2,3,4], k = 0

输出:
[0,0,0,0]

解释:
k == 0 时,所有数字都被 0 替换。

示例 3

输入:
code = [2,4,9,3], k = -2

输出:
[12,5,6,13]

解释:
解密后的密码为 [3+9, 2+3, 4+2, 9+4]
注意数组是循环连接的。如果 k < 0,那么和为 之前的数字


提示

  • n == code.length
  • 1 <= n <= 100
  • 1 <= code[i] <= 100
  • -(n - 1) <= k <= n - 1

题解

解题思路

使用滑动窗口可以高效解决该问题。在滑动窗口中:

  • 初始化第一个窗口的和 s
  • 随着窗口向右滑动,利用增量更新代替重新计算窗口和,减少计算量。
滑动窗口初始位置
  • 如果 k > 0:窗口的下标范围是 [1, k+1)
  • 如果 k < 0:窗口的下标范围是 [n-|k|, n)

无论 k 是正是负,窗口的大小始终是 |k|

滑动更新逻辑
  • 每次右移窗口:
    • 移入窗口的元素下标为 r % n
    • 移出窗口的元素下标为 (r - |k|) % n
  • s += 移入元素 - 移出元素 更新窗口和。

为什么可以省略 k = 0 的特判?

k = 0 时:

  • 窗口大小为 |k| = 0,初始和为 sum(code[r-k:r]) = sum([]) = 0
  • 滑动窗口更新时,code[r % n]code[(r - k) % n] 是同一个元素,s 的增量总为 0。
  • 因此,结果始终是 [0] * n,无需显式处理。

代码实现

from typing import Listclass Solution:def decrypt(self, code: List[int], k: int) -> List[int]:n = len(code)r = k + 1 if k > 0 else n  # 初始窗口右边界ans = [0] * nk = abs(k)  # 窗口大小s = sum(code[r - k:r])  # 第一个窗口的和for i in range(n):ans[i] = s  # 当前窗口的和# 更新窗口和:加上新元素,减去旧元素s += code[r % n] - code[(r - k) % n]r += 1  # 窗口右边界右移return ans

复杂度分析

  • 时间复杂度:

    • 窗口初始化和为 O(k)
    • 滑动窗口更新和为 O(n)
      总复杂度为 O(n + k)
  • 空间复杂度:
    仅使用了常数额外空间,空间复杂度为 O(1)


示例运行

示例 1
code = [5, 7, 1, 4]
k = 3
solution = Solution()
print(solution.decrypt(code, k))  # 输出:[12, 10, 16, 13]
示例 2
code = [1, 2, 3, 4]
k = 0
print(solution.decrypt(code, k))  # 输出:[0, 0, 0, 0]
示例 3
code = [2, 4, 9, 3]
k = -2
print(solution.decrypt(code, k))  # 输出:[12, 5, 6, 13]

总结

本题利用滑动窗口减少计算量,结合循环数组的特性,完成了高效的解密逻辑。通过将 k > 0k < 0 的情况统一到一个逻辑中,代码实现更为简洁,并成功省略了 k = 0 的特判。

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

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

相关文章

Spring工作流程

&#xff08;3&#xff09;案例工作流程 启动服务器初始化过程 1.服务器启动&#xff0c;执行ServletContainersInitConfig类&#xff0c;初始化web容器功能类似于以前的web.xml 2.执行createServletApplicationContext方法&#xff0c;创建了WebApplicationContext对象 该方法…

unity 中 RectTransform 的常用几个属性

RectTransform rectTransform this.GetComponent<RectTransform>(); rectTransform this.transform as RectTransform; Vector3 vector1 rectTransform.position; //自身轴心点相对于锚点的位置&#xff08;编译器显示的pos&#xff09; …

C语言第13节:指针(3)

1. 回调函数 回调函数的基本思想是&#xff0c;将函数指针作为参数传递给另一个函数&#xff0c;并在需要时通过这个函数指针调用对应的函数。这种方式允许一个函数对执行的内容进行控制&#xff0c;而不需要知道具体的实现细节。 回调函数在以下场景中尤为有用&#xff1a; …

用pyspark把kafka主题数据经过etl导入另一个主题中的有关报错

首先看一下我们的示例代码 import os from pyspark.sql import SparkSession import pyspark.sql.functions as F """ ------------------------------------------Description : TODO&#xff1a;SourceFile : etl_stream_kafkaAuthor : zxxDate : 2024/11/…

【MyBatis 源码阅读与笔记】Mapper 接口的动态代理实现

MyBatis 源码阅读与笔记 题目&#xff1a;Mapper 接口的动态代理实现 研究 MyBatis 如何通过动态代理为 Mapper 接口创建实现类。重点分析 MapperProxy 类&#xff0c;理解其如何拦截方法调用并执行 SQL。 笔记 1 动态代理原理 MyBatis 使用 JDK 动态代理为 Mapper 接口创建…

STM32芯片EXIT外部中断的配置与原理以及模板代码(标准库)

配置EXIT外部中断其实就是把GPIO刀NVIC的各个外设配置好 第一步&#xff1a;配置RCC&#xff0c;把我们涉及到的外设的时钟都打开 &#xff08;此处EXTI是默认打开的&#xff0c;而NVIC是内核外设无需配置&#xff09; 第二步&#xff1a;配置GPIO,选择端口为输入模式 第三…

深入解析PostgreSQL中的PL/pgSQL语法

在数据库管理系统中&#xff0c;PostgreSQL因其强大的功能和稳定性而受到广泛欢迎。其中&#xff0c;PL/pgSQL作为PostgreSQL的过程化语言&#xff0c;为用户提供了更为灵活和强大的编程能力。本文将深入解析PL/pgSQL的语法&#xff0c;帮助读者更好地掌握这门语言&#xff0c;…

misc设备驱动

MISC 理解 简化创建设备号&#xff0c;cdev&#xff0c;class&#xff0c;device 的步骤。 设备树 代码 模块初始化和退出 平台下驱动匹配和移除 MiSC 结构体 文件描述符的处理函数 其他

layui合并table相同内的行

<table border"1" id"table1" class"layui-table"><thead><tr><th><b>姓名</b></th><th><b>项目</b></th><th><b>任务</b></th><th><b>…

java ssm 羽绒服商城网站 在线商城 在线服饰销售网站 源码 jsp

一、项目简介 本项目是一套基于SSM的羽绒服商城网站&#xff0c;主要针对计算机相关专业的和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本、软件工具等。 项目都经过严格调试&#xff0c;确保可以运行&#xff01; 二、技术实现 ​后端技术&#xff…

程序里sendStringParametersAsUnicode=true的配置导致sql server cpu使用率高问题处理

一 问题描述 近期生产环境几台sql server从库cpu使用率总是打满&#xff0c;发现抓的带变量值的慢sql&#xff0c;手动代入变量值执行并不慢&#xff0c;秒级返回&#xff0c;不知道问题出在哪里。 二 问题排查 用扩展事件或者sql profiler抓慢sql&#xff0c;抓到了变量值&…

《强激光与粒子束》

投 稿 须 知 1. 投稿著作所有列名作者皆同意在投稿文章经《强激光与粒子束》&#xff08;简称《强》刊&#xff09;刊登后&#xff0c;其著作财产权即转让给《强激光与粒子束》编辑部&#xff0c;但作者仍保有著作人身权&#xff0c;并保有本著作未来自行集结、教学等个人使用…

基于 MUSA 的大语言模型推理和服务框架vLLM

1. 引言​ vLLM是一个高性能且内存高效的大语言模型推理和服务框架&#xff0c;也是当前业界使用范围最广的大模型推理框架&#xff0c;截至目前github star数28.4k。该框架性能优秀&#xff0c;而且部署容易&#xff0c;使用CUDA/ROCm提供GPU加速能力。但vLLM目前不支持使用摩…

OpenAI震撼发布:桌面版ChatGPT,Windows macOS双平台AI编程体验!

【雪球导读】 「OpenAI推出ChatGPT桌面端」 OpenAI重磅推出ChatGPT桌面端&#xff0c;全面支持Windows和macOS系统&#xff01;这款新工具为用户在日常生活和工作中提供了前所未有的无缝交互体验。对于那些依赖桌面端进行开发工作的专业人士来说&#xff0c;这一更新带来了令人…

Python小白学习教程从入门到入坑------习题课3(基础巩固)

目录 一、选择题 二、实战题 2.1 实战一:从键盘获取一个4位整数&#xff0c;分别输出个位、十位、百位、千位上的数字 2.2 实战二&#xff1a;根据父母身高预测儿子的身高 一、选择题 1、以下哪项不是Python语言的保留字符&#xff08; C &#xff09; A. False B. and C. …

湘潭大学软件工程算法设计与分析考试复习笔记(四)

回顾 湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;一&#xff09;湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;二&#xff09;湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;三&#xff09; 前言 现在是晚上十一点&#xff0c;我平时是十…

Python学习29天

二分查找 # 定义函数冒泡排序法从大到小排列 def bbble_sort(list):# i控制排序次数for i in range(len(list) - 1):# j控制每次排序比较次数for j in range(len(list) - 1 - i):if list[j] < list[j 1]:list[j], list[j 1] list[j 1], list[j] # 定义二分查找函数 def…

SparkSQL的执行过程:从源码角度解析逻辑计划、优化计划和物理计划

SparkSQL的执行过程可以分为以下几个阶段&#xff1a;从用户的SQL语句到最终生成的RDD执行&#xff0c;涵盖逻辑计划、优化计划和物理计划。以下是详细的源码角度解析&#xff1a; 1. 解析阶段&#xff08;Parsing&#xff09; SQL语句解析&#xff1a;Spark 使用 Catalyst 引…

(Linux)搭建静态网站——基于http/https协议的静态网站

简单了解nginx配置文件 1.下载并开启nginx服务 下载 [rootlocalhost ~]# dnf install nginx -y开启 [rootlocalhost ~]# systemctl restart nginx 1.(1)搭建静态网站——基于http协议的静态网站 实验1&#xff1a;搭建一个web服务器&#xff0c;访问该服务器时显示“hello w…

【数据结构-表达式解析】力扣227. 基本计算器 II

给你一个字符串表达式 s &#xff0c;请你实现一个基本计算器来计算并返回它的值。 整数除法仅保留整数部分。 你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。 注意&#xff1a;不允许使用任何将字符串作为数学表达式计算的内置函数&#…