LintCode第1712題 - 和相同的二元子數組

描述

在由若干?0?和?1?組成的數組?A?中,有多少個和為?S?的非空子數組

樣例 1:

輸入:A = [1,0,1,0,1], S = 2
輸出:4
解釋:
如下面黑體所示,有 4 個滿足題目要求的子數組:
[1,0,1]
[1,0,1]
[1,0,1,0]
[0,1,0,1]

樣例 2:

輸入:A = [0,0,0,0,0,0,1,0,0,0], S = 0
輸出:27
解釋:
和為 S 的子數組有 27 個

思路1 采用同向雙指針法 通過暴力雙指針枚舉所有起點 + 滑動右指針

每輪固定左指針 left,右指針從 left 向右滑動; 每次累加和,如果等于 S,就記錄這個子數組; 關鍵點是從每個 left 出發,向右滑,不能隨便跳過任何一個組合

代碼1:

public class Solution {

? ? public int numSubarraysWithSum(int[] A, int S) {

? ? ? ? int n=A.length;

? ? ? ? int count=0;

? ? ? ? for(int left = 0; left < n; left++)//同向雙指針法計算是否為目前值S

? ? ? ? {

? ? ? ? ? ? int accumulatedNum = 0;

? ? ? ? ? ? for (int right = left; right < n; right++) {

? ? ? ? ? ? ? ? accumulatedNum += A[right];

? ? ? ? ? ? ? ? if (accumulatedNum == S) {

? ? ? ? ? ? ? ? ? ? count++;

? ? ? ? ? ? ? ? } else if (accumulatedNum > S) {

? ? ? ? ? ? ? ? ? ? break; // 再滑動右指針沒意義了

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ?

? ? ? ? }

? ? ? ? return count;

? ? }

}

思路2 前綴和 + 哈希表

每輪固定左指針 left,右指針從 left 向右滑動; 每次累加和,如果等于 S,就記錄這個子數組; 關鍵點是從每個 left 出發,向右滑,不能隨便跳過任何一個組合

任意一個子數組 [i..j] 的和 = prefixSum[j] - prefixSum[i-1] 若要求 sum[i..j] = S,則等價于: prefixSum[j] - prefixSum[i-1] == S → prefixSum[i-1] == prefixSum[j] - S

prefixMap 來記錄前綴和出現的次數,作用是:

鍵(Key)值(Value)
某個前綴和 x這個前綴和 x 出現過多少次

prefixMap.put(0, 1);?

前綴和為 0 出現了 1 次(這是初始化)

它允許我們從下標 0 開始的子數組也能被統計進來

accumulatedNum 當前前綴和,也就是從 A[0] 到 A[i] 的累加值

count 當前找到的子數組個數,最終返回這個值

步驟 1:累加前綴和?

accumulatedNum += A[i]; // 累加前綴和 將當前元素 A[i] 累加到 accumulatedNum 中; accumulatedNum 代表前綴和 prefixSum[i]

每次比較都是當前前綴和-s 當有

既等式

prefixSum[j] - prefixSum[i-1] == S
prefixSum[i-1] == prefixSum[j] - S
accumulatedNum - S

是我們想找的值 意思為在前面的位置出現過這樣一個前綴和,
這樣從那個位置之后到我當前位置,就剛好是一個和為 S 的子數組

prefixMap.get(accumulatedNum - S)之前有多少個位置,它們的前綴和等于 accumulatedNum - S

每一個都可以作為「合法子數組的起點」,從那個點到當前 i 的子數組和為 S
所以:prefixMap.get(accumulatedNum - S) 就是當前命中的合法子數組個數

prefixMap.put(accumulatedNum, prefixMap.getOrDefault(accumulatedNum, 0) + 1);
把當前的前綴和 accumulatedNum 的出現次數 +1

因為我們要統計「從前面某個位置 i 到當前位置 j 的和為 S 的子數組數量」。

每一個前綴和,都可能為后面提供組合,所以我們必須記錄它出現的次數

import java.util.*;

public class Solution {
? ? public int numSubarraysWithSum(int[] A, int S) {
? ? ? ? int accumulatedNum = 0; // 當前的前綴和
? ? ? ? int count = 0;

? ? ? ? Map<Integer, Integer> prefixMap = new HashMap<>();
? ? ? ? prefixMap.put(0, 1); // 初始化:前綴和為 0 出現了 1 次

? ? ? ? for (int i = 0; i < A.length; i++) {
? ? ? ? ? ? accumulatedNum += A[i]; // 累加當前前綴和

? ? ? ? ? ? // 如果之前出現過 accumulatedNum - S,就說明找到了滿足條件的子數組
? ? ? ? ? ? if (prefixMap.containsKey(accumulatedNum - S)) {
? ? ? ? ? ? ? ? count += prefixMap.get(accumulatedNum - S);
? ? ? ? ? ? }

? ? ? ? ? ? // 更新當前前綴和出現次數
? ? ? ? ? ? prefixMap.put(accumulatedNum, prefixMap.getOrDefault(accumulatedNum, 0) + 1);
? ? ? ? }

? ? ? ? return count;
? ? }
}? ?

一個疑問點是如果不寫

那么就會漏掉那些從 index = 0 開始就滿足和為 S 的子數組

例 A = [1, 0, 1], S = 2

有 prefixMap.put(0, 1) 的時候:

iA[i]accumulatedNumaccumulatedNum - SprefixMap命中count
011-1?0
101-1?0
2120?1

最終結果:?找到了子數組 [0, 1, 2],和為 2。

當prefixMap.put(0, 1)沒有的時候?

當前累計為 2 的時候,你想找的前綴和是 0,但 prefixMap 里沒有

prefixMap.getOrDefault(accumulatedNum, 0) 會取下標為0的值 因為沒有放入1 則

這段合法子數組 [1, 0, 1] 就不會被統計 即錯誤結果?最終結果是:count=0

推薦剛開始學習使用雙指針法 進階使用前綴和 + 哈希表

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

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

相關文章

【MySQL筆記】庫操作與表操作

&#x1f525;個人主頁&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收錄專欄&#x1f308;&#xff1a;MySQL &#x1f339;往期回顧&#x1f339;&#xff1a;【MySQL】認識MySQL &#x1f516;流水不爭&#xff0c;爭的是滔滔不 一、庫操作1.1 顯示數據庫1.2 創建數據庫…

SpringBoot3實戰(SpringBoot3+Vue3基本增刪改查、前后端通信交互、配置后端跨域請求、數據批量刪除(超詳細))(3)

目錄 一、從0快速搭建SpringBoot3工程、SpringBoot3集成MyBatis、PageHelper分頁查詢的詳細教程。(博客鏈接) 二、實現前端與后端通信對接數據。(axios工具) &#xff08;1&#xff09;安裝axios。(vue工程目錄) &#xff08;2&#xff09;封裝請求工具類。(request.js) <1&…

單播、廣播、組播和任播

文章目錄 一、單播二、廣播三、組播四、任播代碼示例&#xff1a; 五、各種播的比較 一、單播 單播&#xff08;Unicast&#xff09;是一種網絡通信方式&#xff0c;它指的是在網絡中從一個源節點到一個單一目標節點對的傳輸模式。單播傳輸時&#xff0c;數據包從發送端直接發…

【實戰】deepseek數據分類用戶評論數據

在平時的工作中&#xff0c;我們會遇到數據分類的情況&#xff0c;比如將一些文本劃分為各個標簽。如果人工分類這塊的工作量將是非常大&#xff0c;而且分類數據的準確性也不高。我們需要用到一些工具來實現。提高效率的同時也提高準確率。 1.示例數據 用戶ID 時間戳 評論場…

技術視角解讀:游戲出海如何借助AWS全球架構突破性能與合規瓶頸

【場景痛點】 某二次元卡牌手游團隊在東南亞市場遭遇聯機延遲投訴率高達37%&#xff0c;日本地區因數據合規問題面臨下架風險。在傳統IDC架構下&#xff0c;運維團隊需要同時管理3個區域的物理服務器&#xff0c;版本更新耗時長達6小時。 【技術架構升級】 通過AWS Local Zones…

【JavaEE】網絡編程socket

1.????前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 親愛的朋友們&#x1f44b;&#x1f44b;&#xff0c;這里是E綿綿呀????。 如果你喜歡這篇文章&#xff0c;請別吝嗇你的點贊????和收藏&#x1f4d6;&#x1f4d6;。如果你對我的…

第16屆藍橋杯單片機4T模擬賽三

本次模擬賽涉及的模塊&#xff1a;基礎三件套&#xff08;Led&Relay&#xff0c;按鍵、數碼管&#xff09; 進階單件套&#xff08;pcf8591的AD模塊&#xff09; 附件&#xff1a; 各模塊底層代碼在文章的結尾 一、數碼管部分 1.頁面1 頁面1要顯示的格式是&#xff1a; …

網絡華為HCIA+HCIP IPv6

目錄 IPv4現狀 IPv6基本報頭 IPv6擴展報頭 IPv6地址 IPv6地址縮寫規范 ?編輯 IPv6地址分配 IPv6單播地址分配 IPv6單播地址接口標識 IPv6常見單播地址 - GUA &#xff08;2 / 3 開頭&#xff09; IPv6常見單播地址 - ULA IPv6常見單播地址 - LLA IPv6組播地…

基于YOLOv8深度學習的智能小麥害蟲檢測識別系統

作者簡介&#xff1a;Java領域優質創作者、CSDN博客專家 、CSDN內容合伙人、掘金特邀作者、阿里云博客專家、51CTO特邀作者、多年架構師設計經驗、多年校企合作經驗&#xff0c;被多個學校常年聘為校外企業導師&#xff0c;指導學生畢業設計并參與學生畢業答辯指導&#xff0c;…

Mac:Maven 下載+安裝+環境配置(詳細講解)

&#x1f4cc; 下載 Maven 下載地址&#xff1a;https://maven.apache.org/download.cgi &#x1f4cc; 無需安裝 Apache官網下載 Maven 壓縮包&#xff0c;無需安裝&#xff0c;下載解壓后放到自己指定目錄下即可。 按我自己的習慣&#xff0c;我會在用戶 jane 目錄下新建…

XSS-labs(反射型XSS) 靶場 1-13關 通關

目錄 前言 XSS漏洞概述 XSS漏洞分類 通關日記 level1 分析 解題 ?level2 分析 解題 方法一&#xff1a;閉合標簽 方法二&#xff1a;閉合雙引號 level3 分析 解題 level4 分析 解題 level5 分析 解題 level6 分析 解題 level7 分析 解體 level8 …

GPT-5 將免費向所有用戶開放?

GPT-5 將免費向所有用戶開放&#xff1f; 硅谷知名分析師 Ben Thompson 最近與 OpenAI CEO Sam Altman 進行了一場深度對談&#xff0c;其中Sam Altman透漏GPT-5將免費向大家發放。 OpenAI 這波操作可不是一時沖動&#xff0c;而是被逼出來的。DeepSeek 這個新秀橫空出世&am…

【雜記二】git, github, vscode等

一、前言 暫時空著... 二、git 2.1 可能的疑問 1. VSCode 項目名和 GitHub 倉庫名是否需要一致&#xff1f; 不需要一致。 VSCode 項目名&#xff08;也就是你本地的文件夾名字&#xff09;和 GitHub 倉庫名可以不一樣。 Git 是一個分布式版本控制系統&#xff0c;它主要關…

數學愛好者寫的編程系列文章

作為一個數學愛好者&#xff0c;我大學讀的專業卻不是數學專業&#xff0c;而是跟計算機有關的專業。原本我對編程一竅不通&#xff0c;平時上課也是在看數學文獻&#xff0c;作業基本靠同學&#xff0c;考試及格就行。不過后來因為畢業的壓力&#xff0c;我還是擁抱編程了&…

FPGA 以太網通信(四)網絡視頻傳輸系統

一、網絡視頻傳輸系統 網絡視頻傳輸系統使用ov5640攝像頭采集數據&#xff0c;通過組件UDP幀將視頻數據實時傳輸給上位機。 ov5640視頻傳輸帶寬 像素分辨率設為640x480&#xff0c;幀率設為60幀&#xff0c;像素格式為RGB565&#xff0c;傳輸帶寬為 640 x 480 x 16bit x 60 fps…

[leetcode]1631. 最小體力消耗路徑(bool類型dfs+二分答案/記憶化剪枝/并查集Kruskal思想)

題目鏈接 題意 給定 n m n\times m nm地圖 要從(1,1) 走到 (n,m) 定義高度絕對差為四聯通意義下相鄰的兩個點高度的絕對值之差 定義路徑的體力值為整條路徑上 所有高度絕對差的max 求所有路徑中 最小的路徑體力值是多少 方法1 這是我一開始自己寫的記憶化剪枝 比較暴力 時…

DeepSeek寫打臺球手機小游戲

DeepSeek寫打臺球手機小游戲 提問 根據提的要求&#xff0c;讓DeepSeek整理的需求&#xff0c;進行提問&#xff0c;內容如下&#xff1a; 請生成一個包含以下功能的可運行移動端打臺球小游戲H5文件&#xff1a; 要求 可以重新開始游戲 可以暫停游戲 有白球和其他顏色的球&am…

webpack使用詳細步驟

項目描述 本項目 webpack 的基本使用。 webpack 官方&#xff1a;https://webpack.docschina.org/concepts/ Element-plus 官方&#xff1a;https://element-plus.sxtxhy.com/zh-CN/ Vue3 官方&#xff1a;https://cn.vuejs.org/ 項目組成明細 每個步驟完成后重新執行 npm run …

【STM32實物】基于STM32的太陽能充電寶設計

基于STM32的太陽能充電寶設計 演示視頻: 基于STM32的太陽能充電寶設計 硬件組成: 系統硬件包括主控 STM32F103C8T6、0.96 OLED 顯示屏、蜂鳴器、電源自鎖開關、溫度傳感器 DS18B20、繼電器、5 V DC 升壓模塊 、TB4056、18650鋰電池、9 V太陽能板、穩壓降壓 5 V三極管。 功能…

【記一次】AI微調訓練步數計算方式

llama微調訓練步數計算方式,以下數據為假設 一、關鍵參數解析 總樣本數&#xff1a;Num examples 1,047 表示訓練數據集包含 1,047 個樣本。 訓練輪數&#xff1a;Num Epochs 300 表示整個訓練集將被遍歷 300 次。 總批次大小&#xff1a;Total train batch size 80 表示…