【LeetCode 熱題 100】560. 和為 K 的子數組——(解法一)前綴和+暴力

Problem: 560. 和為 K 的子數組
題目:給你一個整數數組 nums 和一個整數 k ,請你統計并返回 該數組中和為 k 的子數組的個數 。子數組是數組中元素的連續非空序列。

【LeetCode 熱題 100】560. 和為 K 的子數組——(解法二)前綴和+哈希表

整體思路

這段代碼的目的是計算一個整數數組 nums 中,和為特定值 k連續子數組 的個數。例如,對于 nums = [1, 1, 1]k = 2,連續子數組 [1, 1] 有兩個,它們分別從索引 0 和 1 開始,所以結果是 2。

該算法采用了一種基于 前綴和(Prefix Sum) 的暴力枚舉法。其核心邏輯步驟如下:

  1. 預處理:計算前綴和

    • 算法首先創建了一個比原數組 nums 長一個單位的數組 sumsum[i] 被設計用來存儲 nums 數組中從索引 0 到 i-1 的所有元素的累加和。
    • sum[0] 初始化為 0,作為計算的基準。
    • 通過一次遍歷,計算出所有前綴和,即 sum[i+1] = sum[i] + nums[i]
    • 核心優勢:一旦擁有了前綴和數組,我們就可以在 O(1) 的時間內計算出任意連續子數組 nums[i...j] 的和。其計算公式為 sum[j+1] - sum[i]。這避免了在每次檢查子數組時都進行重復的求和計算,將一個潛在的 O(N^3) 算法優化到了 O(N^2)。
  2. 枚舉所有子數組并校驗

    • 接下來,代碼使用兩層嵌套的循環來枚舉出所有的連續子數組。
    • 外層循環的變量 j 代表子數組的 結束索引
    • 內層循環的變量 i 代表子數組的 起始索引
    • 通過 for (j=0..n-1)for (i=0..j) 的組合,可以不重不漏地生成所有可能的 (i, j) 對,即所有連續子數組。
    • 對于每一個由 (i, j) 定義的子數組,利用前綴和數組,通過 sum[j+1] - sum[i] 快速得到其和。
    • 將計算出的和與目標值 k進行比較。如果相等,則將計數器 ans 加一。
  3. 返回結果

    • 在遍歷完所有可能的子數組后,ans 中就存儲了最終的總數,將其返回。

總而言之,該算法通過預計算前綴和,然后系統地遍歷所有可能的子數組端點,來解決這個問題。雖然它不是最優解法(最優解法使用哈希表,時間復雜度為O(N)),但它是一個思路清晰且正確的暴力解法。

完整代碼

class Solution {/*** 計算和為 k 的連續子數組的個數。* @param nums 整數數組* @param k 目標和* @return 和為 k 的連續子數組的數量*/public int subarraySum(int[] nums, int k) {// 獲取數組的長度int n = nums.length;// 創建前綴和數組 sum,長度為 n+1。// sum[i] 將存儲 nums[0] 到 nums[i-1] 的和。// sum[0] = 0,作為計算的起點,代表空數組的和。int[] sum = new int[n + 1];// ans 用于累計和為 k 的子數組的數量int ans = 0;// 步驟 1: 預計算前綴和// 遍歷 nums 數組,填充 sum 數組for (int i = 0; i < n; i++) {// sum[i+1] 等于前 i 個元素的和(sum[i])加上當前元素 nums[i]sum[i + 1] = sum[i] + nums[i];}// 步驟 2: 枚舉所有子數組// 外層循環確定子數組的結束索引 jfor (int j = 0; j < n; j++) {// 內層循環確定子數組的起始索引 i// i 的范圍是從 0 到 j,確保 i <= jfor (int i = 0; i <= j; i++) {// 利用前綴和快速計算子數組 nums[i...j] 的和// sum[j+1] 是 nums[0...j] 的和// sum[i]   是 nums[0...i-1] 的和// 兩者相減即為 nums[i...j] 的和if (sum[j + 1] - sum[i] == k) {// 如果子數組的和等于 k,計數器加 1ans++;}}}// 返回最終的計數結果return ans;}
}

時空復雜度

時間復雜度:O(N^2)
  1. 前綴和計算:第一個 for 循環遍歷 nums 數組一次,用于計算前綴和。這個循環執行了 N 次。因此,這部分的時間復雜度是 O(N)
  2. 子數組枚舉
    • 第二個(外層)for 循環的變量 j0N-1,執行 N 次。
    • 第三個(內層)for 循環的變量 i0j。其執行次數依賴于 j
    • 總的執行次數是 1 + 2 + 3 + ... + N,這是一個等差數列求和,結果為 N * (N + 1) / 2
    • 因此,嵌套循環部分的復雜度為 O(N^2)
  3. 循環內部操作:在最內層循環中,sum[j + 1] - sum[i] 和比較操作都是 O(1) 的。

綜合分析
算法的總時間復雜度由各部分相加決定:O(N) + O(N^2)。在 Big O 表示法中,我們只保留最高階項,所以最終的時間復雜度是 O(N^2)

空間復雜度:O(N)
  1. 主要存儲開銷:算法創建了一個名為 sum 的整型數組來存儲前綴和。
  2. 空間大小:該數組的長度是 n + 1,其中 n 是輸入數組 nums 的長度。因此,它占用的空間與輸入規模 N 成線性關系。
  3. 其他變量n, ans, i, j 等變量都只占用常數級別的空間,即 O(1)。

綜合分析
算法所需的額外空間主要由前綴和數組 sum 決定。因此,空間復雜度為 O(N)

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

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

相關文章

android車載開發之HVAC

目前主要在做車載hvac的開發&#xff0c;主要的一些功能主要是hvac&#xff0c;座椅&#xff0c;香氛&#xff0c;設置等的一些模塊&#xff0c;具體模塊下&#xff0c;比如 1.空調 ac&#xff0c;智能模式&#xff08;極速降溫&#xff0c;極速采暖&#xff0c;智能除味&…

深度學習 Diffusers 庫(自留)

&#xff08;本文將圍繞 安裝Diffusers庫及其依賴、理解Diffusers核心概念&#xff1a;Pipeline, Model, Scheduler 、使用預訓練模型進行推理&#xff08;文生圖、圖生圖等&#xff09; 、 自定義模型和調度器 、訓練自己的擴散模型&#xff08;可選&#xff0c;需要大量資源&…

【VPC技術】基礎理論篇

文章目錄 概述相關基礎核心知識軟件定義網絡SDNOverlay 技術 安全組概述 參考博客 &#x1f60a;點此到文末驚喜?? 概述 相關基礎 基本概念 虛擬私有云VPC&#xff1a;是一個隔離的網絡環境&#xff0c;每個VPC擁有專屬的IP地址范圍&#xff08;CIDR&#xff09;、路由表、…

在 RK3588 Ubuntu 上編譯 eglinfo:全流程實戰 + 常見報錯修復

dv1/eglinfo 是一個開源的 EGL 信息檢測工具&#xff0c;廣泛用于 OpenGL ES 圖形棧調試、驅動驗證和嵌入式平臺圖形支持排查。在 Rockchip RK3588 上編譯該工具可以協助我們確認 EGL DRM 是否配置正確&#xff0c;尤其在無窗口系統&#xff08;如 eglfs、framebuffer&#xf…

開源推薦:基于前后端分離架構的WMS倉儲管理系統

開源推薦&#xff1a;基于前后端分離架構的WMS倉儲管理系統 &#x1f525; 在線演示地址&#xff1a;https://tob.toolxq.com/wms/wms.html 點擊上方鏈接可直接體驗系統功能和界面&#xff0c;無需安裝部署 前言 在企業數字化轉型的浪潮中&#xff0c;倉儲管理系統&#xff08…

Redis中List類型常見的操作命令有哪些?

Redis中List類型是一個字符串列表&#xff0c;這里是一些常見的命令&#xff1a; 1&#xff09;lpush:將一個或多個值插入到列表頭部。列表不存在&#xff0c;一個新的列表會被創建。 2&#xff09;rpush:將一個或多個值插入到列表尾部。 3&#xff09;lpop:移除并返回列表頭…

mac重復文件清理,攝影師同款清理方案

攝影師小林盯著屏幕上的警告&#xff1a;“存儲空間不足”&#xff0c;離截稿只剩3小時。她的MacBook如同塞滿回憶的閣樓&#xff0c;128GB的“其他”空間神秘消失。翻看照片庫時&#xff0c;她驚訝地發現——同一組西藏雪山照片竟有十幾個副本&#xff01;這是mac重復文件問題…

lua腳本為什么能保證原子性

Redis 處理客戶端請求是基于單線程模型的&#xff08; Redis 6.0 開始引入了多線程處理網絡 IO&#xff0c;但命令執行仍然是單線程的&#xff09;。這意味著&#xff0c;在任意時刻 Redis 只會執行一個命令或腳本。這種單線程特性確保了當 Redis 在執行一個 Lua 腳本時&#x…

爬蟲詳解:Aipy打造自動抓取代理工具

一、爬蟲的本質與核心功能 爬蟲是一種通過編寫程序自動抓取互聯網公開數據的技術工具&#xff0c;其核心流程包括&#xff1a; 模擬瀏覽器行為&#xff1a;發送 HTTP 請求訪問目標網頁解析頁面結構&#xff1a;提取 HTML/XML 中的關鍵信息&#xff08;如文本、鏈接、圖片&…

Leetcode百題斬-棧

終于來到了棧專題&#xff0c;想想之前來阿里的時候就是面試了一道棧最終通過了終面&#xff0c;也是十分懷念了。 739. Daily Temperatures[Medium] 思路&#xff1a;這就是最典型的單調棧問題了。從后向前維護下一個更大值或者下一個更大值的位置。 可以看一下當年面阿里時…

PIXHAWK(ardupilot4.52)NMEA的解析bug

最近在測試過程中發現在橢球高為負的地方&#xff0c;地面站讀取GPS_RAW_INT (24)消息中的alt高度竟然是正值。而消息中定義的alt并不是一個unsigned數據&#xff0c;理論上是帶有正負符號的。 查看gga的原始信息&#xff1a; $GPGGA,063718.40,3714.8533856,N,11845.9411766,…

Linux容器講解以及對應軟件使用

一、容器基礎知識講解 1.1 微服務的部署策略 部署單體應用意味著運行大型應用的多個相同副本&#xff0c;通常提供若干臺&#xff08;N&#xff09;服務器&#xff08;物理機或虛擬 機&#xff09;&#xff0c;在每臺服務器上運行若干個&#xff08;M&#xff09;應用實例。部…

企業級應用技術-ELK日志分析系統

目錄 #1.1ELK平臺介紹 1.1.1ELK概述 1.1.2Elasticsearch 1.1.3Logstash 1.1.4Kibana #2.1部署ES群集 2.1.1基本配置 2.1.2安裝Elasticsearch 2.1.3安裝Logstash 2.1.4Filebeat 2.1.5安裝Kibana 1.1ELK平臺介紹 1.1.1ELK概述 ELK 是三個開源工具的縮寫&#xff0c;分別是Elas…

Shiro漏洞復現

Shiro簡介 Apache Shiro是一種功能強大且易于使用的Java安全框架&#xff0c;它執行身份驗證、授權、 加密和會話管理&#xff0c;可用于保護任何應用程序的安全。 Shiro提供了應用程序安全性API來執行以下方面&#xff1a; 1.身份驗證&#xff1a;證明用戶身份&#xff0c;通…

VSCode 中使用 Google Test(GTest)框架測試

VSCode 中使用 Google Test&#xff08;GTest&#xff09;框架在 VSCode 中對 C 代碼進行測試的示例&#xff1a; 一、Unbutu x86使用gtest 環境配置 安裝 GTest &#xff1a;在 Ubuntu 系統中&#xff0c;可以通過命令sudo apt-get install libgtest-dev安裝 GTest 庫。對于…

【1.6 漫畫數據庫設計實戰 - 從零開始設計高性能數據庫】

1.6 漫畫數據庫設計實戰 - 從零開始設計高性能數據庫 &#x1f3af; 學習目標 掌握數據庫表結構設計原則理解字段類型選擇與優化學會雪花算法ID生成策略掌握索引設計與優化技巧了解分庫分表設計方案 &#x1f4d6; 故事開始 小明: “老王&#xff0c;我總是不知道怎么設計數…

OSPF虛擬鏈路術語一覽:快速掌握網絡路由

大家好&#xff0c;這里是G-LAB IT實驗室。今天帶大家了解一下OSPF的相關知識&#xff01; 01 OSPF虛擬鏈路術語大全 網絡架構中&#xff0c;OSPF&#xff08;開放式最短路徑優先&#xff09;是一種重要的路由協議。通過其鏈路狀態路由機制&#xff0c;OSPF能夠有效維護和更新…

oracle常用的函數(一) 之 to_char、to_date

文章目錄 前言to_char基本語法格式模型格式模型介紹無FM示例使用FM輸出貨幣負數輸出尖括號 將日期格式化將數字格式化為帶有貨幣符號和千位分隔符的格式總結 to_date語法語法示例 戳這里&#xff0c;第二彈 → oracle常用的函數&#xff08;二&#xff09; 之 nvl、decode、l…

數據庫服務器宕機的處理方法與實戰策略

在當今數字化時代,數據庫作為企業數據存儲與管理的核心,承載著業務運行的關鍵信息。一旦數據庫服務器宕機,將導致業務中斷、數據丟失等嚴重后果,甚至可能給企業帶來巨大的經濟損失和聲譽損害。因此,掌握一套系統、科學的數據庫服務器宕機處理方法尤為重要。本文將從應急響…

如何hack邊緣的kubelet修改Cgroup數值

之前做了一個VPA項目的需求&#xff0c;就是需要不重啟的方式修改容器的Cgroup的值已達到垂直擴縮容的目的&#xff0c;項目中核心的思路如下 上游下發要VPA的結果的值寫入到容器的Annotation里面Kubelet 感知到這個 annoation 的變化我們本地運行一個 Agent&#xff0c;里面運…