力扣992做題筆記

左神做法的理論依據

我們可以通過 集合的包含關系具體示例枚舉 來直觀理解這一推導過程。以下結合題目示例 1 進行詳細說明:

示例 1 分析

輸入nums = [1,2,1,2,3], k = 2
目標:計算恰好包含 2 種不同整數 的子數組個數。

步驟一集合 A 的計數

滑動窗口的核心邏輯是:

  • 對于每個右邊界 r,找到最小左邊界 l,使得窗口 [l, r] 內不同整數個數 ≤k。
  • 此時,左邊界可以是 [l, r] 中的任意位置,因此貢獻 r - l + 1 個子數組。

以示例 1 為例,滑動窗口計算 findNumsofMost(nums, 2)(即 |A|)的過程如下:

r元素窗口內元素不同數最小左邊界 l貢獻子數組數
01[1]101
12[1,2]202
21[1,2,1]203
32[1,2,1,2]204
43[2,1,2,3]3(超過 2)移動 l 到 1窗口 [1,4] 含 2,1,3(3 種,仍超過)→ 繼續移動 l 到 2 → 窗口 [2,4] 含 1,2,3(3 種,仍超過)→ 移動 l 到 3 → 窗口 [3,4] 含 2,3(2 種)→ 最小 l=3,貢獻 (4-3+1=2)

累加結果:(1+2+3+4+2=12),即 |A|=12。
findNumsofMost(nums, 1)(即 |B|)的計算結果為 5(僅含單個元素的子數組),因此:

步驟 2:定義集合 B(不超過 k-1 種)

集合 B 包含所有不同整數個數 ≤1 的子數組(即僅含 1 種整數)。
枚舉所有滿足條件的子數組:

  • 單個元素:[1], [2], [1], [2], [3],共 5 個。
  • 連續相同元素的子數組:
    • [1](位置 0)、[2](位置 1)、[1](位置 2)、[2](位置 3)、[3](位置 4)。
    • 無長度 ≥2 的連續相同元素(因為數組中相鄰元素不同)。
  • 集合 B 的總數:5 個。
步驟 3:計算集合差集 A - B

根據定義:
恰好含 k 種的子數組個數 = |A| - |B|

  • 集合 A 包含 含 1 種或 2 種 的子數組。

  • 集合 B 包含 僅含 1 種 的子數組。

  • 因此,A - B 即為僅含 2 種的子數組,其數量為:
    |A| - |B| = 12 - 5 = 7

    這與題目示例 1 的輸出一致。

數學推導:集合差集的嚴格性

  • 設 (f(m)) 表示 不同整數個數 ≤m 的子數組個數。

  • 恰好含 k 種的子數組必須滿足:

    • 不同整數個數 ≤k(屬于集合 A),
    • 且不同整數個數 >k-1(不屬于集合 B)。
  • 因此,恰好含 k 種的子數組是 A 中排除 B 的部分,即:

    = f(k) - f(k-1)

例子 2:更簡單的數組(nums = [1,1,2], k=2)

為了更直觀,我們用一個更短的數組驗證。

問題目標

找到所有「恰好有 2 種不同整數」的子數組。

數組分析

數組 [1,1,2] 的所有子數組及其不同整數個數:

子數組內容不同整數個數
[0,0][1]1
[0,1][1,1]1
[0,2][1,1,2]2
[1,1][1]1
[1,2][1,2]2
[2,2][2]1
集合 A(≤2)和 B(≤1)的大小
  • 集合 A(≤2):所有子數組都滿足(因為最大不同個數是 2),共 6 個。
  • 集合 B(≤1):不同整數個數為 1 的子數組,即 [0,0], [0,1], [1,1], [2,2] → 共 4 個。
結論驗證

恰好有 2 種不同整數的子數組是 [0,2], [1,2] → 共 2 個。
根據公式 |A| - |B| = 6 - 4 = 2,與實際結果一致。

數學推導:為什么差集是正確的?

用數學符號形式化定義:

  • f(k) 為「不同整數個數 ≤k 的子數組數目」。
  • g(k) 為「不同整數個數恰好等于k 的子數組數目」。

根據定義,f(k) 是所有 g(1), g(2), ..., g(k) 的和,即:
[ f(k) = g(1) + g(2) + … + g(k) ]

同理,f(k-1) 是:
[ f(k-1) = g(1) + g(2) + … + g(k-1) ]

兩式相減得:
[ f(k) - f(k-1) = g(k) ]

這正是題目要求的「恰好有k種不同整數的子數組數目」。

總結

通過具體例子和數學推導可以看出:
「不超過k的子數組數」減去「不超過k-1的子數組數」,本質是通過「前綴和相減」的方式,精準提取出「恰好等于k」的子數組數目。這種方法將復雜的「恰好k」問題轉化為更易計算的「不超過k」問題,是滑動窗口算法中常用的技巧。

代碼

class Solution {public int subarraysWithKDistinct(int[] nums, int k) {return findNumsofMost(nums, k) - findNumsofMost(nums, k - 1); }private static final int maxn = 20001;private static int[] cnts = new int[maxn];private int findNumsofMost(int[] nums, int k) { Arrays.fill(cnts, 1, nums.length + 1, 0);int ans = 0;for (int r = 0, l = 0, collect = 0; r < nums.length; r ++) { if (++cnts[nums[r]] == 1) { collect ++;}while (collect > k) { if (--cnts[nums[l++]] == 0) { collect--;}}ans += r - l + 1;}return ans;}
}

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

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

相關文章

Kubernetes 運維操作手冊:從 etcd 快照進行精確恢復

1 5 步實現 etcd 精確恢復 將快照恢復到本地 etcd 數據目錄。使用恢復的數據啟動本地 etcd 實例。使用 etcdctl 查詢特定鍵&#xff08;例如&#xff0c;ConfigMap&#xff09;。使用 auger 解碼以提取干凈的 YAML。使用 kubectl 申請恢復到您的實時集群。 本指南將指導您從 et…

LeetCode Hot100刷題——合并區間

56. 合并區間 以數組 intervals 表示若干個區間的集合&#xff0c;其中單個區間為 intervals[i] [starti, endi] 。請你合并所有重疊的區間&#xff0c;并返回 一個不重疊的區間數組&#xff0c;該數組需恰好覆蓋輸入中的所有區間 。 示例 1&#xff1a; 輸入&#xff1a;i…

《Metasploit框架核心模塊解析與安全防護實踐》?

目錄 ??一、框架模塊化設計與安全驗證價值?? ??1. 漏洞驗證模塊&#xff08;Exploit Modules&#xff09;?? ??2. 安全評估模塊&#xff08;Auxiliary Modules&#xff09;?? ??3. 安全響應模塊&#xff08;Post-Exploitation&#xff09;?? ??4. 載荷安全…

Cribl 中 Parser 扮演著重要的角色 + 例子

先看文檔: Parser | Cribl Docs Parser The Parser Function can be used to extract fields out of events or reserialize (rewrite) events with a subset of fields. Reserialization will preserve the format of the events. For example, if an event contains comma…

程序設計實踐--排序(1)

&#xff11;、插入排序&#xff08;一個數組&#xff09; #include<bits/stdc.h> using namespace std; const int N1e35; int a[N]; int n; int main(){cin>>n;for(int i1;i<n;i){cin>>a[i];}for(int i1;i<n;i){int va[i];int ji-1;while(j>1&am…

MAC電腦中右鍵后復制和拷貝的區別

在Mac電腦中&#xff0c;右鍵菜單中的“復制”和“拷貝”操作在功能上有所不同&#xff1a; 復制 功能&#xff1a;在選定的位置創建一個與原始文件相同的副本。快捷鍵&#xff1a;CommandD用于在當前位置快速復制文件&#xff0c;CommandC用于將內容復制到剪貼板。效果&…

新能源汽車焊接智能節氣閥

在新能源汽車產業迅猛發展的浪潮中&#xff0c;制造工藝的優劣直接關系到車輛的性能、安全與市場競爭力。焊接&#xff0c;作為新能源汽車生產流程里的關鍵一環&#xff0c;無論是構建車身框架&#xff0c;還是連接電池模組&#xff0c;其質量的好壞都起著決定性作用。而在焊接…

Linux:面試題

1. 什么是中斷和異常&#xff1f; 中斷&#xff1a;由外部設備&#xff08;如鍵盤、網卡&#xff09;觸發的異步事件&#xff0c;用于通知 CPU 有緊急事件需要處理。 異常&#xff1a;由 CPU 內部執行指令時產生的同步事件&#xff08;如除零錯誤、缺頁異常&#xff09;&#…

linux關閉某端口暫用的進程

查看是哪個端口暫用 sudo netstat -tulpn | grep :80根據圖片 顯示 80端口暫用的 進程id是 3002 結束進程id為3002的進程 sudo kill -9 3002

【學習心得】Jupyter 如何在conda的base環境中其他虛擬環境內核

如果你在conda的base環境運行了jupyter lab打開了一個ipynb文本&#xff0c;此時選擇的內核是base虛擬環境的Python內核&#xff0c;如果我想切換成其他conda虛擬環境來運行這個文件該怎么辦&#xff1f;下面我們試著還原一下問題&#xff0c;并且解決問題。 【注】 這個問題出…

React Flow 邊的基礎知識與示例:從基本屬性到代碼實例詳解

本文為《React Agent&#xff1a;從零開始構建 AI 智能體》專欄系列文章。 專欄地址&#xff1a;https://blog.csdn.net/suiyingy/category_12933485.html。項目地址&#xff1a;https://gitee.com/fgai/react-agent&#xff08;含完整代碼示?例與實戰源&#xff09;。完整介紹…

ZooKeeper 原理解析及優劣比較

大家好&#xff0c;這里是架構資源棧&#xff01;點擊上方關注&#xff0c;添加“星標”&#xff0c;一起學習大廠前沿架構&#xff01; 引言 在分布式系統中&#xff0c;服務注冊、配置管理、分布式鎖、選舉等場景都需要一個高可用、一致性強的協調服務。Apache ZooKeeper 憑…

模糊照片變清晰:照片高清修復 ComfyUI 使用教學

模糊照片變清晰 滿心歡喜地翻出舊相冊&#xff0c;想重溫那些美好的回憶&#xff0c;結果照片卻模糊不清&#xff0c;根本看不清當年的模樣&#xff1b;又或者精心拍攝了一張超有氛圍感的照片&#xff0c;結果因為手抖或者光線問題&#xff0c;變得模糊&#xff0c;無法發朋友圈…

IEEEtran中文獻中的作者大于3個時,用et al.省略

latex&#xff1a; 在使用bib文件的時候&#xff0c;當參考文獻超過三個作者時&#xff0c;第三個作者后加逗號并接上et al.。我使用的是IEEEtran.bst。 \begingroup \small \bibliographystyle{IEEEtran} \bibliography{newbmyref1} \endgroup1.需要將IEEEtran.bst添加到這個…

Android Studio Kotlin 中的方法添加灰色參數提示

在使用 Android Studio 時&#xff0c; 我發現使用 Java 編寫方法后在調用方法時&#xff0c; 會自動顯示灰色的參數。 但在 Kotlin 中沒有顯示&#xff0c; 于是找了各種方法最后找到了設置&#xff0c; 并且以本文章記錄下來。 博主博客 https://blog.uso6.comhttps://blog.…

python寵物用品商城系統

目錄 技術棧介紹具體實現截圖系統設計研究方法&#xff1a;設計步驟設計流程核心代碼部分展示研究方法詳細視頻演示試驗方案論文大綱源碼獲取/詳細視頻演示 技術棧介紹 Django-SpringBoot-php-Node.js-flask 本課題的研究方法和研究步驟基本合理&#xff0c;難度適中&#xf…

《具身智能機器人:自修復材料與智能結構設計的前沿探索》

在具身智能機器人的研發進程中&#xff0c;自修復材料與智能結構設計無疑是極具挑戰性與創新性的關鍵領域&#xff0c;吸引著無數科研人員投身其中&#xff0c;探尋未知。 傳統機器人在復雜多變的環境中執行任務時&#xff0c;一旦材料出現損傷&#xff0c;如外殼刮擦、內部線…

矩陣的秩(Rank)

矩陣的秩&#xff08;Rank&#xff09;是線性代數中的核心概念&#xff0c;表示矩陣中線性無關的行&#xff08;或列&#xff09;的最大數量&#xff0c;反映了矩陣所包含的“獨立信息”的多少。以下是其核心要點&#xff1a; 1. 秩的定義 行秩&#xff1a;矩陣中線性無關的行…

麒麟系統編譯osg —— 擴展篇

一、背景 前文講到麒麟系統編譯osg&#xff0c;通常情況下會提示&#xff1a; 意思是無法生成插件osgdb_jpeg&#xff0c;需要配置“JPEG_LIBRARY”和“JPEG_INCLUDE_DIR”。 經查&#xff0c;本機不存在jpeglib.h和libjpeg.so&#xff0c;需要另外安裝。 二、編譯jpeg庫 …

【數據倉庫面試題合集①】數據建模高頻面試題及解析

?? 面試官愛問什么?——核心考察點 數據建模作為數倉崗位面試的重頭戲,考察的不只是模型知識,更是對業務理解、抽象能力和工程落地經驗的綜合評估。常見題型可分為三類: 概念類:模型類型、建模方法論(如維度建模、范式建模) 場景類:給定一個業務場景進行模型設計(如…