【算法滑動窗口】 將x減到0的最小操作數

在這里插入圖片描述

將x減到0的最小操作數

    • 個人總結的八步歸納
    • AI的歸納
      • **8步歸納法(極簡直白版)**
        • 1. 問題本質
        • 2. 問題特征
        • 3. 切入點
        • 4. 解決流程
        • 5. 每步目標與操作
        • 6. 注意事項
        • 7. 最終目標
        • 8. 整體總結
      • 代碼對照(逐行解析)
      • 舉個栗子🌰
      • **一句話總結**

題目鏈接:

將x減到0的最小操作數

題目描述:
給你一個整數數組 nums 和一個整數 x 。每一次操作時,你應當移除數組 nums 最左邊或最右邊的元素,然后從 x 中減去該元素的值。請注意,需要 修改 數組以供接下來的操作使用。

如果可以將 x 恰好 減到 0 ,返回 最小操作數 ;否則,返回 -1 。

示例 1:

輸入:nums = [1,1,4,2,3], x = 5
輸出:2
解釋:最佳解決方案是移除后兩個元素,將 x 減到 0 。
示例 2:

輸入:nums = [5,6,7,8,9], x = 4
輸出:-1
示例 3:

輸入:nums = [3,2,20,1,1,3], x = 10
輸出:5
解釋:最佳解決方案是移除后三個元素和前兩個元素(總共 5 次操作),將 x 減到 0 。

提示:

1 <= nums.length <= 105
1 <= nums[i] <= 104
1 <= x <= 109

題目轉化:

這個題目的要求是求出數組左右兩邊相加等于x的最短長度的和
也就是:
找出最長的子數組的長度
這個子數組的所有元素的和正好等于sum - x
sum是整個數組的所有元素的和

和之前討論過的滑動窗口一模一樣:

我們這里就直接使用滑動窗口來解決這道題目:

個人總結的八步歸納

第一步:用自己的話,描述一下眼前的這個問題,它是一個怎么樣的問題?

要求的是數組左右兩邊的和等于X的最小長度

第二步:這個問題有哪些特征,能讓我們去判斷,它屬于這一類的問題?
正難則反,可以涉及到連續的長度子數組,以及求最短,最長的長度,這道題目就可以轉換為求出一個子數組,要求在這個連續的子數組的和是等于 總數組的和減去x的,最后返回總數組的長度減去子數組的長度,如果這個子數組的和不能等于sum-x,那么就返回-1。

第三步:想要解決這類問題,切入點啥,即第一步我們要從哪里開始?

切入在在于轉化為求一個連續子數組的最長的長度,這個子數組的和等于sum-x

第四步:解決這個問題的流程是怎么樣的?這里說的流程是指,這道題可以分成12345…步,只要按照12345這個順序做下去,我們就能解決這個問題。

  1. 定義一個ret變量,初始化為-1,記錄子數組的最長長度
  2. 定義一個sum記錄總數組的和,n記錄總數組的長度
  3. 定義一個target記錄sum - x,如果這個target小于0,那返回-1
  4. 定義一個temp記錄這個子數組的和
  5. 使用同向雙指針去擴展temp的右窗口
  6. 如果temp 的值大于了target,那就左縮窗口
  7. 如果temp 剛好等于target,那就更新re的結果為最大的長度
  8. 最后,如果ret= -1,說明沒有這個連續子數組沒有剛好等于target的值,那么就返回-1
  9. 如果ret不是等于-1,那么就返回n - ret

第五步:在流程的12345步中,每一步的目標是什么(就是要求到些什么)?每一步需要用到哪些知識

  1. ret為了記錄子數組的最長長度
  2. sum 記錄總數組長度的值
  3. target記錄sum -x的值
  4. temp記錄子數組的元素總和
  5. 開始使用滑動窗口去擴展temp的值
  6. 當temp的值大于target時,就要左縮窗口,當temp=target時,更新ret的結果
  7. 如果ret=-1,那就說明沒有子數組的和正好等于sum-x
  8. 如果ret !=-1;那就說明有子數組的和剛好等于了sum-x
  9. 最后我們就返回n-ret即可

第六步:要思考在運用這些知識和技巧的時候,有些需要注意的地方。

  1. 記錄target時,如果sum - x < 0了,那就直接返回了-1
  2. 使用的是temp來記錄子數組的和,來帶入滑動窗口中計算
  3. 當temp == target的時候,才會去更新結果
  4. 最后要返回的是-1或者是n-ret

第七步:要解決這個問題,最終的目標是啥?也就是說,我最終要求出的是啥?

最終目標是求出這個總數組中左右子數組的和正好等于x的最小長度
我們將這個目標轉換為了:
求出這個總數組中的一個連續的子數組的和正好等于sum-x的最長長度

第八步:重新對上面的第一步至第七步,進行回顧和揣摩(包括問題類型,特征,切入點,解決過程,1234567…步,每步需要用的哪些知識方法)

(2)AI+8步歸納結合
在模仿完題目后,先自己用8步歸納法對錯題進行歸納,然后讓deepseek,按照8步歸納法的原則,對題目進行總結歸納,你再把自己總結歸納出的東西,跟AI對比,看看有哪些地方可以改進。

AI的歸納

8步歸納法(極簡直白版)


1. 問題本質

從數組兩端不斷刪除元素,使刪除的元素和等于x,求最少刪幾次?若做不到,返回-1。


2. 問題特征
  • 逆向思維:求兩端刪除次數最少 → 等價于求中間保留的連續子數組最長
  • 數學轉化:中間子數組的和 = 總和 - x
  • 滑動窗口適用:數組元素全為正數,適合用雙指針找連續子數組

3. 切入點
  1. 算數組總和 sum
  2. 算目標值 target = sum - x
    • target < 0:直接返回-1(總和都不夠x)
  3. 用滑動窗口找和為target最長子數組

4. 解決流程
  1. 算總和:遍歷數組求sum
  2. 算目標target = sum - x,若target < 0返回-1
  3. 滑動窗口
    • 雙指針left=0currentSum=0
    • right右移累加元素 → currentSum += nums[right]
    • currentSum > target時,左移left減元素 → currentSum -= nums[left++]
    • currentSum == target時,記錄窗口長度right-left+1的最大值
  4. 結果處理
    • 若未找到 → 返回-1
    • 若找到 → 最少操作次數 = 數組長度 - 最長子數組長度

5. 每步目標與操作
步驟做什么為什么這么做
算總和確定中間子數組的目標和轉化問題核心條件
滑動窗口找和為target的最長子數組滑動窗口能高效處理連續子數組問題
結果轉換將子數組長度轉為操作次數原問題要求的是兩端的操作次數

6. 注意事項
  • 邊界情況1:若target = 0(即sum = x),需刪除整個數組 → 返回n
  • 邊界情況2:數組全為1,x=5,但總和=3 → 直接返回-1
  • 效率:每個元素最多被訪問兩次 → 時間復雜度O(n)

7. 最終目標

求最少刪除次數 = 數組長度 - 中間最長子數組的長度


8. 整體總結
  1. 問題轉化:刪除兩端 → 保留中間最長
  2. 核心操作:滑動窗口找和為target的最長子數組
  3. 代碼框架
    計算總和 → 處理邊界 → 滑動窗口找最長子數組 → 返回結果  
    

代碼對照(逐行解析)

class Solution {public int minOperations(int[] nums, int x) {int sum = 0;for (int num : nums) sum += num; // 1. 算總和int target = sum - x;           // 2. 算目標值if (target < 0) return -1;      // 邊界:總和都不夠xint maxLen = -1; // 記錄中間最長子數組的長度int left = 0, currentSum = 0;// 3. 滑動窗口找最長子數組for (int right = 0; right < nums.length; right++) {currentSum += nums[right];  // 右指針擴張while (currentSum > target) // 窗口和太大,左指針收縮currentSum -= nums[left++];if (currentSum == target)   // 找到合法窗口maxLen = Math.max(maxLen, right - left + 1);}// 4. 結果處理return maxLen == -1 ? -1 : nums.length - maxLen;}
}

舉個栗子🌰

以示例1 nums = [1,1,4,2,3], x = 5

  1. sum = 11target = 11-5 = 6
  2. 找和為6的最長子數組:
    • [1,1,4] 和=6 → 長度3
    • [4,2] 和=6 → 長度2
    • 最長長度為3
  3. 最少操作次數 = 5(總長) - 3 = 2

一句話總結

求兩端刪最少 → 中間留最長 → 滑動窗口找和為sum-x的最長子數組

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

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

相關文章

RISC-V GPU架構研究進展:在深度學習推理場景的可行性驗證

一、新型算力架構的突圍戰 在英偉達CUDA生態主導的GPU市場中&#xff0c;RISC-V架構正以?開源基因?和?模塊化設計?開辟新賽道。當前主流GPU架構面臨兩大痛點&#xff1a; 指令集封閉性?&#xff1a;NVIDIA的SASS指令集與AMD的GCN/RDNA架構均采用私有指令編碼&#xff0c…

LVGL -滑動條

1 滑動條 LVGL 的滑動條(Slider)是一個非常有用的控件,允許用戶通過拖動滑塊或點擊滑條來選擇一個值。 1.1 基本定義 滑動條允許用戶在一個預定義的數值范圍內選擇一個特定的值。它通常由一個軌道(track)和一個滑塊(thumb)組成。用戶可以通過點擊或拖動滑塊來調整數值。…

ROS2學習筆記|Python實現訂閱消息并朗讀的詳細步驟

本教程將詳細介紹如何使用 ROS 2 實現一個節點訂閱另一個節點發布的消息&#xff0c;并將接收到的消息通過 espeakng 庫進行朗讀的完整流程。以下步驟假設你已經安裝好了 ROS 2 環境&#xff08;以 ROS 2 Humble 為例&#xff09;&#xff0c;并熟悉基本的 Linux 操作。 注意&…

WPF封裝常用的TCP、串口、Modbus、MQTT、Webapi、PLC通訊工具類

WPF封裝常用通訊工具類 下面我將為您封裝常用的TCP、串口、Modbus、MQTT、WebAPI和PLC通訊工具類,適用于WPF應用程序開發。 一、TCP通訊工具類 using System; using System.Net.Sockets; using System.Text; using System.Threading.Tasks;public class TcpClientHelper : …

npm pnpm yarn 設置國內鏡像

國內鏡像 常用的國內鏡像&#xff1a; 淘寶鏡像 https://registry.npmmirror.com 騰訊云鏡像?? https://mirrors.cloud.tencent.com/npm/ 華為云鏡像?? https://repo.huaweicloud.com/repository/npm/ CNPM&#xff08;阿里系&#xff09; ?? https://r.cnpmjs.org/ 清華…

P4552 [Poetize6] IncDec Sequence 題解

P4552 [Poetize6] IncDec Sequence - 洛谷 差分貪心 根據題目&#xff1a;一段區間都加1或減1 &#xff0c; 可以想到差分 構建差分數組&#xff1a;sub 我們要讓除了sub[1] , 其他全是0 我們可以的操作是&#xff1a;l1 , r-1 or l-1 , r1 or 一個數1 / -1 所…

Power Query精通指南2:數據轉換——透視/逆透視/分組、橫向縱向合并數據、條件判斷、處理日期時間

文章目錄 七、常見數據轉換7.1 逆透視7.1.1 逆透視操作7.1.2 重建透視表&#xff0c;更新數據7.1.3 三種逆透視方式&#xff08;逆透視列等價于逆透視其他列&#xff09; 7.2 透視7.3 拆分列7.3.1 將列拆分為多列7.3.2 將列拆分為多行7.3.3 拆分到列后逆透視&#xff08;保留列…

使用線性表實現通訊錄管理

目錄 &#x1f680;前言&#x1f99c;任務目標&#x1f31f;順序表實現&#x1f40d;鏈表實現 &#x1f680;前言 大家好&#xff01;我是 EnigmaCoder。 本文介紹線性表的實驗&#xff0c;使用順序表和鏈表實現通訊錄管理&#xff0c;包含初始化、插入、刪除、查詢、輸出。 &a…

firewall docker 沖突問題解決(親測有效)

# 關閉iptables&#xff0c;使用firewall systemctl disable iptables # 禁用服務 systemctl stop iptables # 關閉服務 systemctl status iptables # 查看服務狀態 systemctl enable firewalld # 設置防火墻開機自啟動 systemctl start firewalld # 開啟服務 systemctl s…

[250428] Nginx 1.28.0 發布:性能優化、安全增強及新特性

目錄 Nginx 1.28.0 穩定版發布主要亮點包括&#xff1a;功能增強&#xff1a;安全性改進&#xff1a;其他&#xff1a; Nginx 1.28.0 穩定版發布 Nginx 官方于 4 月 24 日發布了最新的 1.28.0 穩定版本。此版本基于之前的 1.27.x 主線分支&#xff0c;整合了多項新功能、性能優…

昇騰的CANN是什么?跟英偉達CUDA的有什么聯系和區別?【淺談版】

昇騰的CANN&#xff08;Compute Architecture for Neural Networks&#xff09;是華為專門為AI場景設計的異構計算架構&#xff0c;類似于英偉達的CUDA&#xff0c;但它針對的是華為自家的昇騰AI處理器&#xff08;Ascend系列&#xff09;。簡單來說&#xff0c;CANN的作用是連…

C++ STL vector高級特性與實戰技巧

引言 各位小伙伴們好&#xff01;上一篇博客我們介紹了vector的基礎知識和常見操作&#xff0c;今天我們將更深入地探討vector的高級特性、內存管理細節以及實戰應用技巧。 想象一下vector就像一輛能自動變長的公交車&#xff0c;我們上一篇講了如何上下車&#xff08;添加刪…

使用PageHelper實現分頁查詢(詳細)

一&#xff1a;需求分析與設計 1.1 產品原型 &#xff08;1&#xff09;分頁展示&#xff0c;每頁展示10條數據&#xff0c;根據員工姓名進行搜索 &#xff08;2&#xff09;業務規則 1.2 接口設計 &#xff08;1&#xff09;操作&#xff1a;查詢&#xff0c;請求方式&#xf…

手搓傳染病模型(SEICR)

模型描述 SEICR 模型是一種用于描述具有慢性期的傳染病傳播規律的數學模型。該模型將人群分為五個部分&#xff0c;分別是易感個體&#xff08;Susceptible&#xff0c;S&#xff09;、潛伏期個體&#xff08;Exposed&#xff0c;E&#xff09;、急性期感染個體&#xff08;In…

音視頻開源項目列表

音視頻開源項目列表 一、多媒體處理框架 通用音視頻處理 FFmpeg - https://github.com/FFmpeg/FFmpeg 最強大的音視頻處理工具庫支持幾乎所有格式的編解碼提供命令行工具和開發庫 GStreamer - https://gitlab.freedesktop.org/gstreamer/gstreamer 跨平臺多媒體框架基于管道…

通往“共識空域”的系統倫理演化

隨著低空經濟逐步從分布式運營向跨區域聯動發展&#xff0c;AI無人系統不再只在本地決策&#xff0c;而開始涉及跨城市、跨機構的任務調度與行為協調。這一趨勢帶來了新的倫理挑戰&#xff1a;多系統之間如何達成行動共識&#xff1f;算法背后的價值判斷標準能否統一&#xff1…

Elasticsearch 常用的 API 接口

文檔類 API Index API &#xff1a;創建并建立索引&#xff0c;向指定索引添加文檔。例如&#xff1a;PUT /twitter/tweet/1 &#xff0c;添加一個文檔。 Get API &#xff1a;獲取文檔&#xff0c;通過索引、類型和 ID 獲取文檔。如GET /twitter/tweet/1。 DELETE API &…

【Vue】性能優化與調試技巧

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;Vue 文章目錄 1. Vue 性能優化與調試技巧1.1 使用 v-if 替代 v-show 控制條件渲染示例代碼&#xff1a; 1.2 組件懶加載&#xff08;異步組件&#xff09;示例代碼&#xff1a;效果分析圖&#xff08;Mermaid 圖表示&#xff09…

廣義線性模型三劍客:線性回歸、邏輯回歸與Softmax分類的統一視角

文章目錄 廣義線性模型三劍客&#xff1a;線性回歸、邏輯回歸與Softmax分類的統一視角引言&#xff1a;機器學習中的"家族相似性"廣義線性模型(GLMs)基礎三位家族成員的統一視角1. 線性回歸(Linear Regression)2. 邏輯回歸(Logistic Regression)3. Softmax分類(Softm…

【Linux系統篇】:Linux線程控制基礎---線程的創建,等待與終止

?感謝您閱讀本篇文章&#xff0c;文章內容是個人學習筆記的整理&#xff0c;如果哪里有誤的話還請您指正噢? ? 個人主頁&#xff1a;余輝zmh–CSDN博客 ? 文章所屬專欄&#xff1a;Linux篇–CSDN博客 文章目錄 一.線程創建二.線程等待三.線程終止四.擴展內容1.重談pthread_…