【每日一題】Day 7

560.和為K的子數組

題目:

給你一個整數數組 nums 和一個整數 k ,請你統計并返回該數組中和為 k 的子數組的個數 。

子數組是數組中元素的連續非空序列。

示例 1:

輸入:nums = [1,1,1], k = 2
輸出:2

示例 2:

輸入:nums = [1,2,3], k = 3
輸出:2

提示:

1 <= nums.length <= 2 * 104
-1000 <= nums[i] <= 1000
-107 <= k <= 107


1. 暴力法

遍歷數組的每個起點 i
從 i 開始,依次往后延伸,形成子數組 nums[i:j]
計算這個子數組的和
如果等于 k,計數器 +1


代碼實現(Go):

//package main
//
//import "fmt"func subarraySum(nums []int, k int) int {cnt := 0 // 子數組個數// 外層循環:確定子數組起點 ifor i := 0; i < len(nums); i++ {sum := 0 // 初始化子數組和// 內層循環:確定子數組終點 jfor j := i; j < len(nums); j++ {sum += nums[j] // 累加子數組元素if sum == k {  // 如果子數組和等于 kcnt++ // 計數器 +1}}}return cnt
}//func main() {
//	nums1 := []int{1, 1, 1}
//	k1 := 2
//	fmt.Println(subarraySum(nums1, k1)) // 輸出 2
//}

2. 前綴和 + 哈希表優化

前綴和的概念
使用一個叫做“前綴和”的概念。對于數組中的任何位置 j,前綴和 pre[j] 是數組中從第 1 個元素到第 j 個元素的總和。如果想知道從元素 i+1 到 j 的子數組的和,可以用 pre[j] - pre[i] 來計算。

使用 Map 來存儲前綴和
在代碼中,用一個 Map(哈希表)來存儲每個前綴和出現的次數。這是為了快速檢查某個特定的前綴和是否已經存在,以及它出現了多少次。

核心邏輯
在數組中向前移動時,逐步增加 pre(當前的累積和)對于每個新的 pre 值,檢查 pre - k 是否在 Map 中

pre - k 的意義:這個檢查的意義在于,如果 pre - k 存在于 Map 中,說明之前在某個點的累積和是 pre - k。由于當前的累積和是 pre,這意味著從那個點到當前點的子數組之和恰好是 k(因為 pre - (pre - k) = k)

實現

  1. 遍歷數組,累加前綴和 pre[j]
    pre[j]=nums[0]+nums[1]+?+nums[j]

  2. 用哈希表記錄每個前綴和出現的次數
    key = 前綴和
    value = 出現次數

  3. 對于當前前綴和 pre,查找 pre - k 是否在哈希表里

  4. 如果存在,說明從之前某個位置到當前位置的子數組和為 k

  5. 將出現次數累加到結果

代碼實現(Go):

// package main// import "fmt"func subarraySum(nums []int, k int) int {cnt := 0           // 用來記錄子數組的個數pre := 0           // 當前前綴和m := map[int]int{} // 或 m:=make(map[int]int)m[0] = 1           // 前綴和 0 出現 1 次,保證一個數字剛好等于 k 時,也能被正確統計,計數+1for i := 0; i < len(nums); i++ {pre += nums[i] // 更新當前前綴和// 查找 pre - k 是否出現過,如果出現,說明從之前的位置到當前位置之間的子數組和為 kif v, ok := m[pre-k]; ok {cnt += v}// 更新哈希表,記錄當前前綴和出現次數m[pre]++}return cnt
}// func main() {
// 	nums1 := []int{1, 1, 1}
// 	k1 := 2
// 	fmt.Println(subarraySum(nums1, k1)) // 輸出 2
// }

無注釋:

//package main
//
//import "fmt"func subarraySum(nums []int, k int) int {cnt, pre := 0, 0m := map[int]int{}m[0] = 1for i := 0; i < len(nums); i++ {pre += nums[i]if v, ok := m[pre-k]; ok {cnt += v}m[pre]++}return cnt
}//func main() {
//	nums1 := []int{1, 1, 1}
//	k1 := 2
//	fmt.Println(subarraySum(nums1, k1)) // 輸出 2
//}

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

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

相關文章

3ds MAX文件/貼圖名稱亂碼?6大根源及解決方案

在3ds MAX渲染階段&#xff0c;文件或貼圖名稱亂碼導致渲染失敗&#xff0c;是困擾眾多用戶的常見難題。其背后原因多樣&#xff0c;精準定位方能高效解決&#xff1a;亂碼核心根源剖析字符編碼沖突 (最常見)非ASCII字符風險&#xff1a; 文件路徑或名稱包含中文、日文、韓文等…

鏈路聚合路由器OpenMPTCProuter源碼編譯與運行

0.前言 前面寫了兩篇關于MPTCP的文章&#xff1a; 《鏈路聚合技術——多路徑傳輸Multipath TCP(MPTCP)快速實踐》《使用MPTCPBBR進行數據傳輸&#xff0c;讓網絡又快又穩》 對MPTCP有了基本的了解與實踐&#xff0c;并在虛擬的網絡拓撲中實現了鏈路帶寬的疊加。 1.OpenMPTC…

AI時代企業轉型指南:用AI降本增效,銷售轉化翻3倍,獲客成本砍一半!

AI時代&#xff0c;大部分企業每天都在問同一個問題&#xff1a;AI到底能幫我做什么&#xff1f;無論你是做電商、做IP、做操盤手&#xff0c;還是傳統企業老板&#xff0c;你都會發現一個現實——AI真正的用途是用來在業務場景里直接降本增效的。對我個人來說&#xff0c;AI已…

【牛客刷題】最大公約數與最小公倍數:算法詳解與實現

文章目錄 一、題目介紹 1.1 輸入描述 1.2 輸出描述 1.3 示例(含詳細注釋) 二、考察的知識點 三、算法設計思路 3.1 最大公約數(GCD) 3.2 最小公倍數(LCM) 四、流程圖 五、題解實現 六、復雜度分析 七、關鍵算法知識點 一、題目介紹 計算兩個整數的**最大公約數(GCD)和最小公…

將 iPhone 聯系人轉移到 Infinix 的完整指南

從 iPhone 切換到 Infinix 設備是一次令人興奮的升級&#xff0c;但在切換過程中&#xff0c;轉移個人數據&#xff08;尤其是聯系人&#xff09;可能會有些棘手。聯系人是任何手機上最重要的信息類型之一&#xff0c;如果在切換過程中丟失它們&#xff0c;會帶來很大的不便。由…

Clipboard.js 復制內容

插件地址 clipboard.js 中文網 安裝 npm install clipboard --save使用示例 <template><div><div class"copyBtn" click"copyText">復制文本</div ></div> </template><script> // 引入clipboard.js import…

蛇形方陣構造

給出方陣的長寬&#xff0c;n 和 m &#xff0c;按照斜著的蛇形輸出該方陣 面試官給的送分題裸模擬&#xff0c;寫的太慢了沒過&#xff0c;實際確實慢&#xff0c;結束后起碼用了一個多小時才調完 找了下沒找到leetcode 提交的地方&#xff0c;各種oj 倒是有&#xff0c;不過是…

傳統方式部署(RuoYi-Cloud)微服務

實驗環境192.168.10.43和192.168.10.44內存不能小于4G一、安裝MySQL&#xff08;192.168.10.46&#xff09;1、安裝MySQL依賴庫dnf -y install ncurses-compat-libs2、上傳mysql-8.0.42-linux-glibc2.17-x86_64-minimal.tar.xz二進制包到/root目錄&#xff0c;解壓并移動到指定…

Linux網絡服務(一)——計算機網絡參考模型與子網劃分

文章目錄前言一、分層思想1.1 分層的基本概念1.2 點到點與端到端通信的區別二、OSI參考模型2.1 OSI七層模型的結構2.2 各層功能示例&#xff08;以QQ為例&#xff09;2.3 單工&#xff0c;半雙工和全雙工2.4 OSI七層模型總結三、TCP/IP模型3.1 TCP/IP四層與五層模型3.2 TCP/IP協…

Elasticsearch全文檢索中文分詞:IK分詞器詳解與Docker環境集成

目錄一、IK分詞器介紹與選擇1. IK分詞器詳細介紹1.1 基本概念1.2 核心功能1.3 適用場景2. 如果不使用IK分詞器&#xff0c;有哪些替代方案&#xff1f;2.1 默認分詞器的局限性2.2 替代方案及對比2.3 示例&#xff1a;Ngram Tokenizer配置3. 如何選擇分詞器&#xff1f;3.1 決策…

實用軟件推薦

作者給大家推薦兩個軟件&#xff1a;typedown,typora typedown在microsoft上即可下載&#xff0c;免費 如果有更多的需求建議下載typora,typora為付費軟件 typora官網&#xff1a;typora官網 typedown下載&#xff1a;typedown下載 作者曾經發布的一些以"md"為后…

地圖導航怎么測?

地圖導航的測試需要結合功能驗證、性能評估和場景模擬等多維度方法,以下是基于行業標準和實踐的系統化測試方案: 一、核心測試維度與方法 (一)功能測試:覆蓋導航全流程 1、基礎功能驗證 路線規劃:輸入起點 / 終點后,驗證系統是否能生成最短、最快或避開擁堵的路線,并…

力扣70:爬樓梯

力扣70:爬樓梯題目思路代碼題目 假設你正在爬樓梯。需要 n 階你才能到達樓頂。 每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢&#xff1f; 思路 首先我們先列出來前幾個臺階的答案從第一個開始&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;5。…

CoRL 2025|隱空間擴散世界模型LaDi-WM大幅提升機器人操作策略的成功率和跨場景泛化能力

內容源自計算機科研圈在機器人操作任務中&#xff0c;預測性策略近年來在具身人工智能領域引起了廣泛關注&#xff0c;因為它能夠利用預測狀態來提升機器人的操作性能。然而&#xff0c;讓世界模型預測機器人與物體交互的精確未來狀態仍然是一個公認的挑戰&#xff0c;尤其是生…

Rust 入門 生命周期-next2 (十九)

生命周期消除實際上&#xff0c;對于編譯器來說&#xff0c;每一個引用類型都有一個生命周期&#xff0c;那么為什么我們在使用過程中&#xff0c;很多時候無需標注生命周期&#xff1f;例如&#xff1a;fn first_word(s: &str) -> &str {let bytes s.as_bytes();f…

Three.js 動畫循環學習記錄

在上一篇文章中&#xff0c;我們學習了Three.js 坐標系系統與單位理解教程&#xff1a; Three.js 坐標系系統與單位理解教程 接下來我們要學習的是Three.js 的動畫循環 一、動畫循環基礎原理 1. 什么是動畫循環&#xff1f; 動畫循環是連續更新場景狀態并重新渲染的過程&am…

ktg-mes 改造成 Saas 系統

ktg-mes 改造成 Saas 系統 快速檢驗市場&#xff0c;采用最簡單的方案&#xff0c;即添加表字段 截止2025年8月16日上傳的ktg-mes搭建存在一些問題&#xff0c;搭建可看文章&#xff1a; 搭建ktg-mes 改造 1. 添加租戶表 create table sys_tenant (tenant_id bigint au…

【新手易混】find 命令中 -perm 選項的知識點

find 命令是 Linux/Unix 系統中強大的文件查找工具&#xff0c;廣泛用于根據文件名、類型、時間、權限等條件搜索文件。其中&#xff0c;-perm 選項用于按文件權限查找文件&#xff0c;而在 -perm /mode 中出現的斜杠 / 是一種特殊的語法&#xff0c;表示“按位或&#xff08;O…

gdb的load命令和傳給opeocd的monitor flash write_image erase命令的區別

問&#xff1a; "monitor flash write_image erase ${workspaceFolder}/obj/ylad_led_blink.elf", 和 "load", "executable" : "${workspaceFolder}/obj/ylad_led_blink.elf", 的區別&#xff1f;答&#xff1a; 你提到的 "monit…

1. Docker的介紹和安裝

文章目錄1. Docker介紹核心概念核心優勢與虛擬機的區別一句話總結2. Docker的安裝Windows 10/11 安裝 Docker Desktop&#xff08;推薦 WSL2 方式&#xff09;Linux&#xff08;以 Ubuntu / Debian 系為例&#xff09;Docker 是一個開源的容器化平臺&#xff0c;它允許開發者將…