LeetCode-刷題記錄-前綴和合集(本篇blog會持續更新哦~)

一、前綴和(Prefix Sum)算法概述

前綴和算法通過預先計算數組的累加和,可以在常數時間內回答多個區間和相關的查詢問題,是解決子數組和問題中的重要工具。

在這里插入圖片描述

它的基本思想是通過預先計算和存儲數組的前綴和,可以在 O(1) 的時間復雜度內計算任意子數組的和。

在這里插入圖片描述

  1. 定義
    • 對于數組 nums,其前綴和 prefix[i] 定義為從數組起始位置到第 i 個元素的累加和。

在這里插入圖片描述

  • 具體公式:prefix[i] = nums[0] + nums[1] + ... + nums[i]
  1. 計算方法
    • 首先,創建一個額外的數組或哈希表,用來存儲每個位置的前綴和。
    • 通過一次遍歷數組,依次計算并填充這個數組或哈希表。

在這里插入圖片描述

  1. 應用
    • 快速計算子數組和:通過前綴和,可以快速計算任意子數組的和。例如,子數組 nums[l...r] 的和可以通過 prefix[r] - prefix[l-1] 來計算,其中 lr 分別是子數組的左右邊界。

在這里插入圖片描述

  • 解決相關問題:例如,最大子數組和、和為特定值的子數組個數等問題,都可以通過前綴和算法高效解決。

在這里插入圖片描述


二、前綴和習題合集

1. LeetCode 930 和相同的二元子數組

在這里插入圖片描述

  • 思路:

假設原數組的前綴和數組為 sum,且子數組 (i,j] 的區間和為 goal,那么 sum[j]?sum[i]=goal。因此我們可以枚舉 j ,每次查詢滿足該等式的 i 的數量。

用哈希表記錄每一種前綴和出現的次數,假設我們當前枚舉到元素 nums[j],我們只需要查詢哈希表中元素 sum[j]?goal 的數量即可,這些元素的數量即對應了以當前 j 值為右邊界的滿足條件的子數組的數量。

  • pre[j] - pre[i]= goal —> pre[i] = pre[j] - goal

  • 如果存在前綴和為 pre[j] - goal(也就是pre[i])

  • 說明從某個位置 j 到當前位置 i 的子數組和為 goal

最后這些元素的總數量即為所有和為 goal 的子數組數量。

  • 代碼:

class Solution {public int numSubarraysWithSum(int[] nums, int goal) {int n = nums.length; // 數組的長度Map<Integer,Integer> map = new HashMap<>(); // 使用哈希表來記錄前綴和的出現次數int pre_J = 0; // 初始前綴和為0int ans = 0; // 計數器,用來記錄符合條件的子數組個數for (int i = 0; i < n; i++) {map.put(preJ, map.getOrDefault(pre_J, 0) + 1); // 更新前綴和為 preJ 的出現次數pre_J += nums[i]; // 計算當前位置的前綴和//pre[j] - pre[i]= goal //pre[i] = pre[j] - goal// 計算滿足條件的子數組個數// 如果存在前綴和為 pre[j] - goal(也就是pre[i])//說明從某個位置 j 到當前位置 i 的子數組和為 goalans += map.getOrDefault(pre_J - goal, 0);}return ans; // 返回符合條件的子數組個數}
}

2. LeetCode 560 和為K的子數組

在這里插入圖片描述

  • 這里咋一看好像是可以用滑動窗口哈 ,但是發現數據里有負數。因為nums[i]可以小于0,也就是說右指針j向后移1位不能保證區間會增大,左指針i向后移1位也不能保證區間和會減小。

  • 思路 : 同上一題類似

前綴和 + 哈希

class Solution {public static int subarraySum(int[] nums, int k) {int n = nums.length; // 獲取數組長度Map<Integer,Integer> map = new HashMap<>(); // 創建哈希表,用于存儲前綴和及其出現次數int sum = 0; // 初始化前綴和為0int ans = 0; // 初始化結果為0map.put(sum,1); // 將初始的前綴和0放入哈希表,并設其出現次數為1// 遍歷數組for(int num : nums){sum += num; // 計算當前位置的前綴和// 如果哈希表中存在前綴和為sum-k的項,則說明存在和為k的子數組 sum - (sum-k) = kif(map.containsKey(sum - k)){ans += map.get(sum - k); // 更新結果,累加前綴和為sum-k的子數組數量}map.put(sum, map.getOrDefault(sum, 0) + 1); // 更新哈希表,將當前前綴和放入,并更新出現次數}return ans; // 返回結果}
}
  • 初始時,將前綴和為 0 放入哈希表 map 中,表示在初始狀態下存在一個前綴和為 0 的情況,出現次數為 1。

  • 如果 map 中存在 sum - k,則說明從之前的某個位置到當前位置的子數組的和為 k。這是因為 sum - (sum - k) = k

  • 如果存在這樣的前綴和,則將該前綴和的出現次數累加到 ans 中。


3. LeetCode 523 連續的子數組和

在這里插入圖片描述

在這里插入圖片描述

  • 這里要用到數學知識——同余定理

在這里插入圖片描述

  1. 前綴和的定義:preSum[i] 表示 nums 數組從 0 到 i 的元素之和。

    • 如果存在一個子數組 nums[j..i] (j < i),其和是 k 的倍數,則 preSum[i] - preSum[j-1] 必須是 k 的倍數。
  2. 利用余數的性質(同余定理)

    • 如果 preSum[i]preSum[j-1]k 取余得到相同的結果,即 (preSum[i] - preSum[j-1]) % k == 0,則存在這樣的子數組。
    • a%k = b%k ,則 (a-b)%k =0 滿足條件

在這里插入圖片描述

  1. 使用哈希表記錄余數: 使用哈希表來記錄每個余數第一次出現的位置。

class Solution {public boolean checkSubarraySum(int[] nums, int k) {int n = nums.length;int[] pre = new int[n + 1];for (int i = 1; i <= n; i++) {pre[i] = pre[i - 1] + nums[i - 1]; // 計算前綴和}Set<Integer> set = new HashSet<>();for (int i = 2; i <= n; i++) {set.add(pre[i - 2] % k); // 將前綴和前兩項的同余結果加入集合if (set.contains(pre[i] % k)) return true; // 如果當前前綴和對k取模的結果在集合中已經存在,說明找到了符合條件的子數組}return false; // 如果遍歷完沒有找到符合條件的子數組,返回false}
}

更新于:

在這里插入圖片描述

本篇blog會持續更新哦~

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

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

相關文章

初步理解六__《面向互聯網大數據的威脅情報 并行挖掘技術研究 》

初步理解 六 STIX 提出了一種標準化的網絡威脅情報格式(Structured Threat Information eXpression, STIX) gtp STIX&#xff08;Structured Threat Information eXpression&#xff09;是一種用于標準化描述和共享網絡威脅情報的格式和語言。它的設計目標是提供一個通用的…

7.8作業

一、思維導圖 二、 1】按值修改 2】按值查找&#xff0c;返回當前節點的地址 &#xff08;先不考慮重復&#xff0c;如果有重復&#xff0c;返回第一個&#xff09; 3】反轉 4】銷毀鏈表 //按值修改 int value_change(linklistptr H,datatype e,int value) {if(HNULL||empty(H…

Greenplum(二)【SQL】

前言 Greenplum 的剩余部分主要其實主要就是 DDL 和之前學的 MySQL 不大一樣&#xff0c;畢竟 Greenplum 是基于 PostgreSQL 數據庫的&#xff0c;不過那些 DML 和 MySQL、Hive 基本上大差不差&#xff0c;所以就沒有必要浪費時間了。 1、DDL 1.1、庫操作 1.1.1、創建數據庫…

python爬蟲加入進度條

安裝tqdm和requests庫 pip install tqdm -i https://pypi.tuna.tsinghua.edu.cn/simplepip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple帶進度條下載 import time # 引入time模塊&#xff0c;用于處理時間相關的功能 from tqdm import * # 從tqdm包中…

算法力扣刷題 三十六【二叉樹迭代遍歷】

前言 記錄三十五 介紹了二叉樹基礎&#xff0c;和遞歸法模版及遍歷方式&#xff1b; 遞歸&#xff1a;代碼簡單&#xff0c;但要想清楚三步&#xff1a; 確定參數和返回值&#xff1b;確定終止條件&#xff0c;并return什么&#xff1f;&#xff1b;終止條件外的邏輯&#xf…

【AI大模型】賦能兒童安全:樓層與室內定位實踐與未來發展

文章目錄 引言第一章&#xff1a;AI與室內定位技術1.1 AI技術概述1.2 室內定位技術概述1.3 樓層定位的挑戰與解決方案 第二章&#xff1a;兒童定位與安全監控的需求2.1 兒童安全問題的現狀2.2 智能穿戴設備的興起 第三章&#xff1a;技術實現細節3.1 硬件設計與選擇傳感器選擇與…

SpringSecurity中文文檔(Servlet Authorization Architecture )

Authorization 在確定了用戶將如何進行身份驗證之后&#xff0c;還需要配置應用程序的授權規則。 Spring Security 中的高級授權功能是其受歡迎的最有說服力的原因之一。無論您選擇如何進行身份驗證(無論是使用 Spring Security 提供的機制和提供者&#xff0c;還是與容器或其…

兩張圖片合并(右上角添加水印,兼容矢量圖)保留原來的顏色

無縫合并兩張圖片&#xff08;封面右上角添加logo&#xff09;-- opencv &#xff1a; 進行添加logo(水印)由于使用了cv2.seamlessClone&#xff0c;cv2.seamlessClone使用了泊松克隆&#xff08;Poisson Cloning&#xff09;&#xff0c;會根據周圍的顏色信息進行顏色調整&…

tcp并發設計

4注意&#xff1a;原始代碼&#xff0c;如果先關閉服務器端&#xff0c;再次開啟服務器的時候會報"connect: Connection refused "錯誤&#xff0c;這是因為先關服務器端&#xff0c;導致系統認為客戶端仍然在與服務器端連接造成。 可以使用setsockopt setsockopt函…

three-tile 一個開源的輕量級三維瓦片庫

three-tile 介紹 three-tile 是一個開源的輕量級三維瓦片庫&#xff0c;它基于threejs使用typescript開發&#xff0c;提供一個三維地形模型&#xff0c;能輕松給你的應用增加三維瓦片地圖。 源碼&#xff1a;https://github.com/sxguojf/three-tile 示例&#xff1a;https:/…

【TB作品】51單片機 Proteus仿真 00013紅外proteus仿真循跡避障小車

實驗報告&#xff1a;智能小車系統設計與實現 一、背景介紹 本實驗旨在設計并實現一個基于STC89C52單片機控制的智能小車系統。該系統通過超聲波傳感器進行避障&#xff0c;通過紅外接收器實現遠程控制&#xff0c;同時具備循跡功能。整個系統的核心是單片機&#xff0c;它通…

YOLOv10改進 | 損失函數篇 | InnerIoU、InnerSIoU、InnerWIoU、FocusIoU等損失函數

一、本文介紹 本文給大家帶來的是YOLOv10最新改進&#xff0c;為大家帶來最近新提出的InnerIoU的內容同時用Inner的思想結合SIoU、WIoU、GIoU、DIoU、EIOU、CIoU等損失函數&#xff0c;形成 InnerIoU、InnerSIoU、InnerWIoU、等新版本損失函數&#xff0c;同時還結合了Focus和…

LeetCode42(接雨水)[三種解法:理解動態規劃,雙指針,單調棧]

接雨水 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖&#xff0c;計算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 這是一道困難題,難度確實有點層次.我們先來樸素思想走一波. 要求能接多少雨水,我們可以具化到每個硅谷,每個硅谷能存多少雨水,那么答案就是每個…

PDA:Prompt-based Distribution Alignment for Unsupervised Domain Adaptation

文章匯總 式中&#xff0c; y s y^s ys表示源域數據的one-hot ground-truth&#xff0c; K K K為類數&#xff0c; w i w_i wi?和 z ~ s \tilde{z}_s z~s?分別表示源域經過提示調優的最終文本表示和最終圖像表示的第 i i i類。 同理&#xff0c;為了進一步利用目標領域的數據…

防火墻詳解(USG6000V)

0、防火墻組網模式 防火墻能夠工作在三種模式下分別是路由模式、透明模式、旁路檢測模式、混合模式 0.1、路由模式 路由模式&#xff1a;防火墻全部以第三層對外連接&#xff0c;即接口具有IP 地址。一般都用在防火墻是邊界的場景下 防火墻需要的部署/配置&#xff1a; 接…

【入門篇】STM32尋址范圍(更新中)

寫在前面 STM32的尋址范圍涉及存儲器映射和32位地址線的使用。并且STM32的內存地址訪問是按字節編址的,即每個存儲單元是1字節(8位)。 一、尋址大小與范圍 地址線根數 地址編號(二進制) 地址編號數(即內存大小) <

實現基于Elasticsearch的搜索服務

實現基于Elasticsearch的搜索服務 大家好&#xff0c;我是微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 1. Elasticsearch簡介 Elasticsearch是一個開源的分布式搜索引擎&#xff0c;提供強大的全文搜索和分析功能。本文…

10、DDD分層架構

微服務架構模型有很多種&#xff0c;例如洋蔥架構、CQRS和六邊形架構等。雖然這些架構模式提出的時代和背景不同&#xff0c;但其核心理念都是為了設計出“高內聚&#xff0c;低耦合”的微服務&#xff0c;輕松實現微服務的架構演進。DDD分層架構的出現&#xff0c;使微服務的架…

什么是ThreadLocal以及內存泄漏問題、hash沖突問題

ThreadLocal是什么 ThreadLocal類用來提供線程內部的局部變量 它主要有三大特性&#xff1a; 線程安全: 在多線程并發的場景下保證線程安全傳遞數據&#xff1a;通過ThreadLocal在同一線程傳遞公共變量線程隔離&#xff1a;每個線程的變量都是獨立的&#xff0c;不會互相影響…

這次讓我們從幾個點認識一下Mysql的Innodb

MySQL 的 InnoDB 存儲引擎是 MySQL 默認和最常用的存儲引擎之一。它主要關注的是高可靠性、性能以及完整的事務支持。以下是對 InnoDB 存儲引擎的詳細介紹&#xff1a; 1. 數據庫特性 1.1 事務支持 InnoDB 是完全支持事務的存儲引擎&#xff0c;支持四種主要的事務隔離級別&…