前綴和題目:連續的子數組和

文章目錄

  • 題目
    • 標題和出處
    • 難度
    • 題目描述
      • 要求
      • 示例
      • 數據范圍
  • 解法
    • 思路和算法
    • 代碼
    • 復雜度分析

題目

標題和出處

標題:連續的子數組和

出處:523. 連續的子數組和

難度

5 級

題目描述

要求

給定一個整數數組 nums \texttt{nums} nums 和一個整數 k \texttt{k} k,如果 nums \texttt{nums} nums 有一個連續子數組滿足大小至少為 2 \texttt{2} 2 且元素和是 k \texttt{k} k 的倍數,則返回 true \texttt{true} true,否則返回 false \texttt{false} false

對于整數 x \texttt{x} x,如果存在一個整數 n \texttt{n} n 使得 x = n × k \texttt{x} = \texttt{n} \times \texttt{k} x=n×k,則 x \texttt{x} x k \texttt{k} k 的倍數。 0 \texttt{0} 0 總是 k \texttt{k} k 的倍數。

示例

示例 1:

輸入: nums = [23,2,4,6,7], k = 6 \texttt{nums = [23,2,4,6,7], k = 6} nums?=?[23,2,4,6,7],?k?=?6
輸出: true \texttt{true} true
解釋: [2, 4] \texttt{[2, 4]} [2,?4] 是大小為 2 \texttt{2} 2 的子數組,和為 6 \texttt{6} 6

示例 2:

輸入: nums = [23,2,6,4,7], k = 6 \texttt{nums = [23,2,6,4,7], k = 6} nums?=?[23,2,6,4,7],?k?=?6
輸出: true \texttt{true} true
解釋: [23, 2, 6, 4, 7] \texttt{[23, 2, 6, 4, 7]} [23,?2,?6,?4,?7] 是大小為 5 \texttt{5} 5 的子數組,和為 42 \texttt{42} 42
42 \texttt{42} 42 6 \texttt{6} 6 的倍數,因為 42 = 7 × 6 \texttt{42} = \texttt{7} \times \texttt{6} 42=7×6 7 \texttt{7} 7 是一個整數。

示例 3:

輸入: nums = [23,2,6,4,7], k = 13 \texttt{nums = [23,2,6,4,7], k = 13} nums?=?[23,2,6,4,7],?k?=?13
輸出: false \texttt{false} false

數據范圍

  • 1 ≤ nums.length ≤ 10 5 \texttt{1} \le \texttt{nums.length} \le \texttt{10}^\texttt{5} 1nums.length105
  • 0 ≤ nums[i] ≤ 10 9 \texttt{0} \le \texttt{nums[i]} \le \texttt{10}^\texttt{9} 0nums[i]109
  • 0 ≤ sum(nums[i]) ≤ 2 31 ? 1 \texttt{0} \le \texttt{sum(nums[i])} \le \texttt{2}^\texttt{31} - \texttt{1} 0sum(nums[i])231?1
  • 1 ≤ k ≤ 2 31 ? 1 \texttt{1} \le \texttt{k} \le \texttt{2}^\texttt{31} - \texttt{1} 1k231?1

解法

思路和算法

只有當數組 nums \textit{nums} nums 的長度至少為 2 2 2 時,才可能存在長度至少為 2 2 2 的子數組。如果數組 nums \textit{nums} nums 的長度小于 2 2 2,則一定不存在長度至少為 2 2 2 的子數組,返回 false \text{false} false

當數組 nums \textit{nums} nums 的長度至少為 2 2 2 時,為了計算數組 nums \textit{nums} nums 的子數組的元素和,需要計算數組 nums \textit{nums} nums 的前綴和,根據前綴和得到任意一個子數組的元素和。

為了判斷子數組的元素和是否為 k k k 的倍數,需要計算前綴和模 k k k 的余數。對于兩個不同的下標 i i i j j j,其中 i < j i < j i<j,如果這兩個下標對應的前綴和模 k k k 的余數相同,則下標范圍 [ i + 1 , j ] [i + 1, j] [i+1,j] 的子數組的元素和為 k k k 的倍數,該子數組的長度為 j ? i j - i j?i。由于這道題要求子數組的長度至少為 2 2 2,因此應該尋找符合要求的最長子數組,需要記錄每個余數的第一次出現的下標。

從左到右遍歷數組 nums \textit{nums} nums,遍歷過程中計算前綴和模 k k k 的余數,并使用哈希表記錄每個余數的首次出現下標。由于空前綴不包含任何元素,前綴和為 0 0 0,余數也為 0 0 0,其下標為 ? 1 -1 ?1,因此首先將余數 0 0 0 對應下標 ? 1 -1 ?1 存入哈希表。

sum \textit{sum} sum 表示前綴和模 k k k 的余數,初始時 sum = 0 \textit{sum} = 0 sum=0。遍歷到每個元素時,將該元素值加到 sum \textit{sum} sum,然后將 sum \textit{sum} sum 的值更新為 sum m o d k \textit{sum} \bmod k summodk(應確保 0 ≤ sum < k 0 \le \textit{sum} < k 0sum<k)。更新 sum \textit{sum} sum 的值之后,判斷哈希表中是否存在余數 sum \textit{sum} sum,執行相應的操作。

  • 如果哈希表中存在余數 sum \textit{sum} sum,則從哈希表中得到 sum \textit{sum} sum 第一次出現的下標 prevIndex \textit{prevIndex} prevIndex,用 i i i 表示當前下標,則以當前元素結尾的和為 k k k 的倍數的最長子數組的長度是 i ? prevIndex i - \textit{prevIndex} i?prevIndex,如果 i ? prevIndex ≥ 2 i - \textit{prevIndex} \ge 2 i?prevIndex2,則找到一個長度至少為 2 2 2 且和為 k k k 的倍數的的子數組,返回 true \text{true} true

  • 如果哈希表中不存在余數 sum \textit{sum} sum,則當前下標是余數 sum \textit{sum} sum 第一次出現,將 sum \textit{sum} sum 對應下標 i i i 存入哈希表。

遍歷結束之后,如果沒有找到長度至少為 2 2 2 且和為 k k k 的倍數的的子數組,則返回 false \text{false} false

由于哈希表中存儲的是每個余數第一次出現的下標,因此當遍歷到下標 i i i 時,如果哈希表中存在相同余數的下標 prevIndex \textit{prevIndex} prevIndex,則以下標 i i i 結尾的和為 k k k 的倍數的最長子數組的長度是 i ? prevIndex i - \textit{prevIndex} i?prevIndex。如果 i ? prevIndex < 2 i - \textit{prevIndex} < 2 i?prevIndex<2,則以下標 i i i 結尾的子數組中不存在長度至少為 2 2 2 且和為 k k k 的倍數的子數組。因此上述做法可以確保得到正確的結果。

代碼

class Solution {public boolean checkSubarraySum(int[] nums, int k) {int length = nums.length;if (length < 2) {return false;}Map<Integer, Integer> indices = new HashMap<Integer, Integer>();indices.put(0, -1);int sum = 0;for (int i = 0; i < length; i++) {sum = (sum + nums[i]) % k;if (indices.containsKey(sum)) {int prevIndex = indices.get(sum);if (i - prevIndex >= 2) {return true;}} else {indices.put(sum, i);}}return false;}
}

復雜度分析

  • 時間復雜度: O ( n ) O(n) O(n),其中 n n n 是數組 nums \textit{nums} nums 的長度。需要遍歷數組一次計算前綴和模 k k k 的余數,對于每個元素,更新余數、計算答案與操作哈希表的時間都是 O ( 1 ) O(1) O(1)

  • 空間復雜度: O ( k ) O(k) O(k),其中 k k k 是給定的整數。空間復雜度主要取決于哈希表,哈希表中的不同余數個數不超過 k k k 個。

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

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

相關文章

隊的簡單介紹

隊列&#xff1a;只允許在一端進行插入數據操作&#xff0c;在另一端進行刪除數據操作的特殊線性表&#xff0c;隊列具有先進先出 FIFO(First In First Out)的特點。 入隊列&#xff1a;進行插入操作的一端稱為隊尾。 出隊列&#xff1a;進行刪除操作的一端稱為隊頭。 入隊列…

AI-Sphere-Butler之如何將豆包桌面版對接到AI全能管家~新玩法(一)

環境&#xff1a; AI-Sphere-Butler VBCABLE2.1.58 Win10專業版 豆包桌面版1.47.4 ubuntu22.04 英偉達4070ti 12G python3.10 問題描述&#xff1a; AI-Sphere-Butler之如何將豆包桌面版對接到AI全能管家~新玩法&#xff08;一&#xff09; 聊天視頻&#xff1a; AI真…

【STM32】啟動流程

1、.s啟動文件解析 STM32的啟動文件&#xff08;一般是.s匯編文件&#xff0c;如startup_stm32f407xx.s&#xff09;是STM32上電后執行的第一段代碼&#xff0c;承擔著“系統初始化化引導員”的角色。 它的主要作用是設置初始化棧指針&#xff08;SP&#xff09;、程序計數器&…

【vim】通過vim編輯器打開、修改、退出配置文件

通過vim編輯器打開任一配置文件 vim /etc/profile 英文輸入下&#xff0c;按i鍵進入INSERT模式&#xff0c;修改配置文件 完成修改后&#xff0c;按esc鍵退出INSERT模式 英文輸入下&#xff0c;輸入":wq!"&#xff0c;即可保存并退出 :q #不保存并退出 :q! …

Effective Modern C++ 條款6:當 auto 推導類型不符合預期時,使用顯式類型初始化慣用法

在C開發中&#xff0c;auto關鍵字以其簡潔性和高效性被廣泛使用。然而&#xff0c;“自動推導”并非萬能&#xff0c;尤其在某些特殊場景下&#xff0c;auto的推導結果可能與開發者預期不符&#xff0c;甚至導致未定義行為。今天&#xff0c;我們以《Effective Modern C》條款6…

學習Linux進程凍結技術

原文&#xff1a;蝸窩科技Linux進程凍結技術 功耗中經常需要用到&#xff0c;但是linux這塊了解甚少&#xff0c;看到這個文章還蠻適合我閱讀的 1 什么是進程凍結 進程凍結技術&#xff08;freezing of tasks&#xff09;是指在系統hibernate或者suspend的時候&#xff0c;將…

GitHub 趨勢日報 (2025年06月22日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖 624 LLMs-from-scratch 523 ai-engineering-hub 501 n8n 320 data-engineer-handb…

kotlin中為什么新增擴展函數功能?

在 Kotlin 中&#xff0c;擴展函數的本質是「不修改原有類代碼&#xff0c;為其新增功能」&#xff0c;這源自編程中「開閉原則」&#xff08;對擴展開放&#xff0c;對修改關閉&#xff09;的第一性原理。 核心需求&#xff1a;當需要給第三方庫的類&#xff08;如 Android 的…

excel 數據透視表介紹

Excel 數據透視表(PivotTable)就是你的數據分析神器!它能幫你快速匯總、分類、比較和分析 大量數據&#xff0c;從看似雜亂無章的表格中一鍵提取關鍵信息 &#xff0c;生成交互式的匯總報告。無需復雜公式&#xff0c;只需拖拽幾下&#xff0c;就能讓數據“開口說話”&#xff…

半導體行業中的專用標準產品ASSP是什么?

半導體行業中的專用標準產品ASSP是什么&#xff1f; “專用標準產品”&#xff08;ASSP - Application Specific Standard Product&#xff09;是半導體集成電路中的一個重要分類。 你可以把它理解為介于通用標準產品和全定制ASIC之間的一種芯片。以下是它的核心定義和特點&a…

秋招Day14 - MySQL - 鎖

MySQL中有幾種類型的鎖&#xff1f; 鎖粒度來分&#xff0c;有表鎖、頁鎖和行鎖。 加鎖機制劃分&#xff0c;有樂觀鎖和悲觀鎖。 按兼容性劃分&#xff0c;有共享鎖和排他鎖。 按鎖模式劃分&#xff0c;有記錄鎖&#xff0c;間隙鎖&#xff0c;next-key鎖&#xff0c;意向鎖…

/var/lib/docker/overlay2目錄過大怎么辦

/var/lib/docker/overlay2 是 Docker 默認用于存儲 容器鏡像和容器運行時數據 的核心目錄&#xff0c;基于 overlay2 存儲驅動實現。以下是其具體作用和內容的詳細解析&#xff1a; 1. overlay2 目錄的作用 存儲鏡像分層結構&#xff1a; Docker 鏡像采用分層設計&#xff0c;o…

JimuReport:一款免費的數據可視化報表工具

JimuReport&#xff08;積木報表&#xff09;是一款免費的企業級數據可視化報表軟件&#xff0c;提供拖拽的方式像搭建積木一樣完成在線設計&#xff0c;功能涵蓋數據報表、打印設計、圖表報表、門戶設計、大屏設計等。 數據源 JimuReport 支持 30 多種數據源&#xff0c;包括…

Neo4j.5.X社區版創建數據庫和切換數據庫

在使用Neo4j數據庫&#xff08;版本&#xff1a;neo4j-community-5.22.0&#xff09;時&#xff0c;系統自帶的“neo4j”和“system”數據庫適用于日常的簡單學習和練習&#xff0c;但對于新的項目&#xff0c;將項目數據與練習數據混用會帶來諸多不便&#xff0c;例如查詢效率…

DAY33神經網絡

浙大疏錦行 定義了一個簡單的神經網絡&#xff0c;主要是掌握pytorch框架

拼團系統多層限流架構詳解

拼團系統多層限流架構詳解 一、整體架構設計理念 多層限流采用"層層設防"思想&#xff0c;通過網關層全局流量控制→服務層接口粒度限流→本地資源隔離→熱點參數精準防護的四級防御體系&#xff0c;實現從粗到細的流量治理&#xff0c;確保大促期間系統穩定性。 …

[ctfshow web入門] web92 `==`特性與intval特性

信息收集 和之前的題差不多&#xff0c;這次是使用了不嚴格相等的&#xff0c;詳情看這篇博客&#xff1a; 和 在 PHP 中有何區別&#xff1f;一共包含哪些部分&#xff1f; 首先&#xff0c;不能使$num 4476&#xff0c;然后需要使intval($num,0)4476 include("flag…

在Springboot項目部署時遇到,centos服務器上,curl請求目標地址不通 ,curl -x 可以請求通的解決辦法

在甲方服務器部署項目時&#xff0c;通常遇到需要開通外網權限的問題&#xff0c;有的是直接給開通服務器的白名單&#xff0c;就可以直接訪問白名單外網地址了。也有的是通過網絡轉發&#xff0c;將url前面的部分替換&#xff0c;可以進行網絡請求。有一次遇到一個罕見的&…

Python異步爬蟲編程技巧:從入門到高級實戰指南

Python異步爬蟲編程技巧&#xff1a;從入門到高級實戰指南 &#x1f680; &#x1f4da; 目錄 前言&#xff1a;為什么要學異步爬蟲異步編程基礎概念異步爬蟲核心技術棧入門實戰&#xff1a;第一個異步爬蟲進階技巧&#xff1a;并發控制與資源管理高級實戰&#xff1a;分布式…

JMeter-SSE響應數據自動化3.0

背景 此次因為多了一些需要過濾排除的錯誤(數量很少)&#xff0c;還需要修改下JMeter的jtl文件輸出數據&#xff08;后續統計數據需要&#xff09; 所以只涉及到JSR腳本的一些改動(此部分改動并不會影響到JMeter的HTML報告) 改動 主要通過設置JMeter中prev輸出數據變量threadN…