LeetCode算法日記 - Day 22: 提莫攻擊、Z字形變換

目錄

1. 提莫攻擊

1.1 題目解析

1.2 解法

1.3 代碼實現

2.? Z字形變換

2.1 題目解析

2.2 解法

2.3 代碼實現


1. 提莫攻擊

495. 提莫攻擊 - 力扣(LeetCode)

在《英雄聯盟》的世界中,有一個叫 “提莫” 的英雄。他的攻擊可以讓敵方英雄艾希(編者注:寒冰射手)進入中毒狀態。

當提莫攻擊艾希,艾希的中毒狀態正好持續?duration?秒。

正式地講,提莫在?t?發起攻擊意味著艾希在時間區間?[t, t + duration - 1](含?t?和?t + duration - 1)處于中毒狀態。如果提莫在中毒影響結束??再次攻擊,中毒狀態計時器將會?重置?,在新的攻擊之后,中毒影響將會在?duration?秒后結束。

給你一個?非遞減?的整數數組?timeSeries?,其中?timeSeries[i]?表示提莫在?timeSeries[i]?秒時對艾希發起攻擊,以及一個表示中毒持續時間的整數?duration?。

返回艾希處于中毒狀態的??秒數。

示例 1:

輸入:timeSeries = [1,4], duration = 2
輸出:4
解釋:提莫攻擊對艾希的影響如下:
- 第 1 秒,提莫攻擊艾希并使其立即中毒。中毒狀態會維持 2 秒,即第 1 秒和第 2 秒。
- 第 4 秒,提莫再次攻擊艾希,艾希中毒狀態又持續 2 秒,即第 4 秒和第 5 秒。
艾希在第 1、2、4、5 秒處于中毒狀態,所以總中毒秒數是 4 。

示例 2:

輸入:timeSeries = [1,2], duration = 2
輸出:3
解釋:提莫攻擊對艾希的影響如下:
- 第 1 秒,提莫攻擊艾希并使其立即中毒。中毒狀態會維持 2 秒,即第 1 秒和第 2 秒。
- 第 2 秒,提莫再次攻擊艾希,并重置中毒計時器,艾希中毒狀態需要持續 2 秒,即第 2 秒和第 3 秒。
艾希在第 1、2、3 秒處于中毒狀態,所以總中毒秒數是 3 。

提示:

  • 1 <= timeSeries.length <= 104
  • 0 <= timeSeries[i], duration <= 107
  • timeSeries?按?非遞減?順序排列

1.1 題目解析

這是一個典型的“區間累加問題”。提莫的攻擊在時間線上形成若干連續或可能重疊的中毒區間,我們要統計這些區間覆蓋的總長度。抽象后就是:給定若干非遞減區間的起點和固定長度,求這些區間并集的總長度

常規解法

  • 直觀想法是把每次攻擊產生的區間 [timeSeries[i], timeSeries[i]+duration) 都存下來,然后合并重疊區間,再求總長度。

  • 時間復雜度最壞 O(n2)(如果每次都去遍歷合并區間),空間復雜度 O(n) 或更多。

問題分析

  • 因為題目保證 timeSeries 已經非遞減,重疊區間只會出現在相鄰攻擊之間。

  • 所以不不必存所有區間,只需要看相鄰攻擊的間隔 diff = timeSeries[i+1] - timeSeries[i]:

    • diff >= duration → 上一次中毒和下一次攻擊不重疊,總長度加 duration

    • diff < duration → 重疊,總長度只加 diff

  • 這就把問題從“全局區間合并”簡化為線性掃描相鄰元素,O(n) 時間即可解決。

思路轉折

  • 線性掃描每個攻擊時間點,并根據與下一次攻擊間隔計算貢獻長度 → 高效且直觀

  • 關鍵在于理解“重疊部分只計算一次”,所以用 min(diff, duration) 就可以準確累加。

1.2 解法

算法實現

  • 遍歷每次攻擊,統計它對中毒總秒數的貢獻:

貢獻=min?(下一次攻擊間隔,duration)

  • 最后一發攻擊必然完整貢獻 duration。

i)初始化總中毒時間 total = 0

ii)遍歷 timeSeries 的每個元素:

  • 對于第 i 次攻擊,如果不是最后一次:total += min(timeSeries[i+1] - timeSeries[i], duration)

  • 對于最后一次攻擊:total += duration

iii)返回 total

1.3 代碼實現

class Solution {public int findPoisonedDuration(int[] timeSeries, int duration) {int n = timeSeries.length;if (n == 0) return 0;int total = 0;for (int i = 0; i < n - 1; i++) {total += Math.min(timeSeries[i + 1] - timeSeries[i], duration);}total += duration; // 最后一次攻擊的完整中毒時間return total;}
}

復雜度分析

  • 時間復雜度:O(n),只遍歷一次數組

  • 空間復雜度:O(1),只使用常量額外空間

2.? Z字形變換

6. Z 字形變換 - 力扣(LeetCode)

將一個給定字符串?s?根據給定的行數?numRows?,以從上往下、從左到右進行?Z 字形排列。

比如輸入字符串為?"PAYPALISHIRING"?行數為?3?時,排列如下:

P   A   H   N
A P L S I I G
Y   I   R

之后,你的輸出需要從左往右逐行讀取,產生出一個新的字符串,比如:"PAHNAPLSIIGYIR"

請你實現這個將字符串進行指定行數變換的函數:

string convert(string s, int numRows);

示例 1:

輸入:s = "PAYPALISHIRING", numRows = 3
輸出:"PAHNAPLSIIGYIR"

示例 2:

輸入:s = "PAYPALISHIRING", numRows = 4
輸出:"PINALSIGYAHRPI"
解釋:
P     I    N
A   L S  I G
Y A   H R
P     I

示例 3:

輸入:s = "A", numRows = 1
輸出:"A"

提示:

  • 1 <= s.length <= 1000
  • s?由英文字母(小寫和大寫)、','?和?'.'?組成
  • 1 <= numRows <= 1000

2.1 題目解析

這是一個典型的“Z 字形字符串重排”問題,本質是按照規律將字符映射到不同的行,然后按行讀取
抽象后可以看作:

  • 給定字符串 s

  • 給定行數 numRows

  • 將字符串按 Z 字形排列形成多行

  • 最終輸出每行依次拼接后的結果

常規解法

  • 最直觀的做法是構造一個二維數組 char[numRows][?],把每個字符放到對應行和列,然后按行讀取。

  • 復雜度分析:

    • 時間:O(n) 遍歷字符串

    • 空間:O(numRows * len_per_row) → 多余存儲,尤其 numRows 接近 n 時

問題分析

  • 二維數組存儲浪費空間

  • 規律可觀察到:

    • 一個完整 Z 周期長度 = 2*numRows - 2

    • 第 0 行和最后一行:每周期只取一次字符

    • 中間行:每周期要取兩次字符(豎直 + 斜向)

  • 因此無需顯式二維存儲,可以直接計算每行字符索引

思路轉折

  • 線性掃描行號,每行按照周期公式取字符

  • 避免二維數組 → 節省空間

  • 核心在于理解周期長度和每行字符的索引規律

2.2 解法

  • Z 字形排列的規律可以用公式表示:

周期長度=d=2?numRows?2

  • 每行字符索引:

    • 第一行:0, 0+d, 0+2d, ...

    • 中間行 i:豎直字符 j+i,斜向字符 j+d-i(j 為周期起點)

    • 最后一行:numRows-1, numRows-1+d, ...

i)處理特殊情況:numRows == 1 → 返回原字符串

ii)初始化 StringBuilder ret

iii)遍歷第一行字符,按周期添加

iiii)遍歷中間行:

  • 外層循環:行號 i = 1 → numRows-2

  • 內層循環:每個周期起點 j = 0, j+d, j+2d, ...

  • 對每個周期 append 兩次字符:豎直和斜向(若未越界)

iiiii)遍歷最后一行字符,按周期添加

iiiiii)返回 ret.toString()

2.3 代碼實現

class Solution {public String convert(String s, int numRows) {int n = s.length();if(numRows == 1) return s; // 特殊情況StringBuilder ret = new StringBuilder();int d = 2*numRows - 2; // 周期長度// 第一行for(int i = 0; i < n; i += d){ret.append(s.charAt(i));}// 中間行for (int i = 1; i < numRows - 1; i++) {for (int j = 0; j + i < n; j += d) {ret.append(s.charAt(j + i));      // 豎直字符if (j + d - i < n) {              // 斜向字符ret.append(s.charAt(j + d - i));}}}// 最后一行for(int j = numRows - 1; j < n; j += d){ret.append(s.charAt(j));}return ret.toString();}
}

復雜度分析

  • 時間復雜度:O(n),每個字符訪問一次

  • 空間復雜度:O(n),StringBuilder 存儲最終結果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920244.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920244.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920244.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Unity筆記(七)——四元數、延遲函數、協同程序

寫在前面&#xff1a;寫本系列(自用)的目的是回顧已經學過的知識、記錄新學習的知識或是記錄心得理解&#xff0c;方便自己以后快速復習&#xff0c;減少遺忘。主要是C#代碼部分。六、四元數歐拉角具有旋轉約定&#xff0c;也就是說&#xff0c;無論你調整角度的順序是什么&…

用大語言模型提升語音翻譯:一種全新的端到端方法

用大語言模型提升語音翻譯:一種全新的端到端方法 在語音翻譯領域,如何將說話內容快速準確地轉化為另一種語言,一直是研究者們關注的焦點。隨著大語言模型(LLM)的興起,我們迎來了一個全新的機遇:利用LLM的強大能力,來提升語音翻譯系統的性能。最近,一項名為“End-to-E…

freeModbus TCP收發數據一段時間后,出現掉線情況(time out問題)

話說這個是真難找啊。我僅僅發表我找到的問題。我在接收幾十到幾百次數據的時候&#xff0c;會出現連接超時&#xff0c;也就是time out。而且ping也ping不通。也就是說明lwip出了問題。首先我先介紹modbus的這個流程。首先是函數eMBTCPInit( MB_TCP_PORT_USE_DEFAULT )我們進入…

Linux Web環境一鍵安裝腳本集合(非docker)

?重磅&#xff01;盹貓的個人小站正式上線啦&#xff5e;誠邀各位技術大佬前來探秘&#xff01;? —— 專為開發者打造的寶藏基地&#xff0c;等你來探索&#xff01; 這里有&#xff1a; &#x1f525; 硬核技術干貨&#xff1a;編程技巧、開發經驗、踩坑指南&#xff0c;帶…

原生安卓#基于Android的愛好者分享論壇的設計與實現/基于Android在線論壇系統app/基于Android的論壇系統的設計與實現的設計與實現

原生安卓#基于Android的愛好者分享論壇的設計與實現/基于Android在線論壇系統app/基于Android的論壇系統的設計與實現的設計與實現

基于Android的超市購物系統的設計與實現、基于android的在線商城app/基于android的在線銷售系統app#android

基于Android的超市購物系統的設計與實現、基于android的在線商城app/基于android的在線銷售系統app#android

C++14 到 C++20 全面解析:語言新特性、標準庫演進與實戰案例

一、前言C 作為一門歷史悠久且不斷演進的編程語言&#xff0c;在 C11 之后進入了“現代化”的快車道。C11 被稱為 C 的第二次誕生&#xff0c;引入了 lambda 表達式、智能指針、右值引用、并發支持等革命性特性。然而&#xff0c;C 的標準化進程并沒有止步于此。C14、C17 和 C2…

HarvardX TinyML小筆記2(番外1:TFLite)

1 原理 tflite就是Tensorflow的輕量化模型&#xff0c;核心處理就是量化和剪枝。不過這部分目前是在Tensorflow中封裝了&#xff0c;所以這里也不會去看細節&#xff0c;主要就是看看原理和使用方法。 量化Quantization&#xff0c;其實就是把原來的float32換成int8。這樣一個…

向量庫Qdrant vs Milvus 系統詳細對比

Qdrant vs Milvus 系統詳細對比 一、它們是什么&#xff08;定位&#xff09; 兩者都是專門做向量相似搜索的數據庫&#xff1a;支持ANN&#xff08;近似最近鄰&#xff09;檢索、向量結構化過濾、REST/gRPC 接口與官方SDK&#xff1b;Milvus 官方也定位為"面向GenAI、可…

適配歐拉操作系統

背景 客戶指定服務器環境歐拉操作系統&#xff0c;版本&#xff1a;6.6.0-72.0.0.76.oe2403sp1.x86_64 需要把Java 應用以及各種中間件部署在歐拉操作系統上。 問題適配MySQL 1.1 編譯報錯 mysql-5.7.40-el7-x86_64.tar.gz版本在CentOS7環境安裝正常 當前歐拉環境直接使用CentO…

學習spring Bean的生命周期

完整項目結構 ├── pom.xml └── src/├── main/│ ├── java/│ │ └── com/│ │ └── zhang/│ │ ├── bean/│ │ │ ├── Address.java│ │ │ ├── MyBeanPostProcessor.java│ │ …

elasticsearch 7.17.23 使用spring data es實現高亮分頁,scroll查詢分頁查詢

一 介紹 1.1 工程結構 1.2 啟動elasticsearch服務 1.3 高亮分頁 DeepSeek 代碼 效果&#xff1a; 1.4 scroll分頁 代碼 2.效果 后臺日志 1.5 完整代碼 https://gitee.com/jurf-liu/es-2.17.x-demo.git

onlyoffice整合springboot+vue實現文檔在線編輯保存

項目上需要用到在線word、excel文檔編輯功能&#xff0c;通過游覽器在線打開一個遠程的word文檔編輯保存&#xff0c;這里記錄下整合思路。 onlyoffice簡介 ONLYOFFICE 是一款開源的辦公套件&#xff0c;提供了一系列在線文檔編輯和協作工具&#xff0c;適用于團隊和個人使用…

Linux筆記10——shell編程基礎-4

補充$#——取參數個數“$n”,有值取值&#xff0c;無值取空字符&#xff0c;一般都會加引號&#xff0c;在某些情況下避免報語法錯誤一、read接收鍵盤輸入[rootlocalhost ~]# cat demo.sh #!/bin/bash echo -n "請輸入你的姓名&#xff1a;" read nameecho "你…

(Redis)過期刪除策略

1. 背景Redis 支持為 Key 設置過期時間&#xff08;TTL&#xff09;&#xff0c;讓數據在一定時間后自動失效。 例如&#xff1a;SET session:1001 "userA" EX 60 # 60 秒后過期但是問題來了&#xff1a;Key 到期后&#xff0c;Redis 什么時候、如何刪除它&#xf…

nodejs 集成mongodb實現增刪改查

初始化項目: npm init -y npm install mongoose -save 安裝mongoose 插件 mongoose 鏈接數據庫語法&#xff1a; mongodb://[username:password]host1[:poert1],host2[:port2]…/[databsase]?[options…] userame&#xff1a; 用戶名 passwrod: 密碼 host1:port1,host2:port…

音視頻學習(五十八):STAP-A模式

什么是 STAP-A&#xff1f; STAP-A 是一種特殊的 RTP 封裝機制&#xff0c;專為 H.264 和 H.265 這類視頻編碼協議設計。它的核心目的只有一個&#xff1a;將多個小的 NALU&#xff08;網絡抽象層單元&#xff09;打包進一個 RTP 包中&#xff0c;以此來減少網絡開銷&#xff0…

管理型交換機通過VLAN劃分實現不同IP跨網段通信配置方法

管理型交換機應用場景豐富&#xff0c;如果要實現不同IP跨網段通信(比如172.22.106.X和192.168.100.X實現通信)&#xff0c;通過VLAN劃分是可以滿足&#xff0c;下面分享基于弱三層交換機RTL9301方案核心模塊SW-24G4F-301EM配置方法&#xff01; 1. 一般結合交換機的應用場景&a…

什么是高防服務器?如何進行防御?

高防服務器是指能為用戶提供防御網絡攻擊&#xff0c;是主要針對DDOS等流量型攻擊能力的服務器&#xff0c;通過部署專業的硬件設備與軟件系統&#xff0c;具備高帶寬、大流量清洗能力&#xff0c;能有效抵御各類惡意流量沖擊&#xff0c;確保服務器穩定運行&#xff0c;保障網…

SW - 增加導出STL數據中的三角面數,增加別人逆向建模的難度

文章目錄SW - 增加導出STL數據中的三角面數&#xff0c;增加別人逆向建模的難度概述筆記SW版本導出時&#xff0c;選擇STL的導出選項默認導出(精細)導出粗糙自定義導出 - 將誤差和角度改為最大自定義導出 - 將誤差,角度,三角面數改為最大備注這幾天的感想關于我不參考人家零件&…