專題二_滑動窗口_將x減到0的最小操作數

一:題目

解釋:每次只能移除數組的邊界,移除的邊界的總和為x,要求返回你移除邊界的最小操作數!

也就是說你最少花幾次移除邊界,就能夠讓這些移除的邊界的和為x,則返回這個次數!

所以這個題目,肯定是要考慮三種情況

情況1:x為正數,小于整個數組之和,且有解決方案

例子:

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

情況2:x為正數,小于整個數組之和 ,但無解決方案!

輸入:nums = [1,1,4,2,3], x = 8
輸出:-1
解釋:沒有解決方案 

本質:x遠大于數組的和

情況3:x為正數,但大于整個數組之和 ,所以無解決方案!

輸入:nums = [1,1,4,2,3], x = 12
輸出:-1
解釋:沒有解決方案  數組總和都才10

本質:x遠大于數組的和

注:x不可能為負數,題目已經規定了x>=1

二:算法

這道題,我們正向解題,是很難的,所以正難則反:

找"一段連續的區域和為sum - x"就可以了

而題目要求的是最小操作數,

所以找的是"最長的連續區域,且區域和為sum - x"

所以上面說過的三種情況,我們就可以進行區分了,假設sum - x的值,用tager來存儲,則:

targe<0? 代表符合情況3直接返回-1,反之則是情況1和情況2,則仍需要通過計算才可以得知是否存在解決方案

解釋:

你只有x不大于數組之和,你是不可能一眼就能看出其有沒有解決方案的,所以我們只能實現定義一個返回值,假設為ret,如果ret從始至終都沒有被更新過,說明其沒有解決方案,反之有解決方案!所以,情況3可以一開始就避免掉,但是情況2和情況1還需根據結果來判斷!

①:暴力

O(N^2),left以不同元素作為起點,right向右遍歷,如果區間的和==targe,則記錄,反之遍歷完了都沒有符合的,則left++,right從left位置開始向右遍歷,繼續判斷....

注:保留的right肯定是從left開始遍歷的,而不是left+1的位置,因為可能left下標的元素就==targe!

②:滑動窗口

暴力能優化的點:

1:left++后,我們的right不需要再回退到left處,而是就在原地!

解釋:

left++是因為之前區間的和>targe了,所以更改起點left的位置來重新找,但是此時left++后,數組有三種情況:

a:數組之和仍大于targe,則right不需要懂,而left還需++

b:數組之和==targe,則判斷更新結果之后,right再++

c:數組之和<targe,則right++

所以綜上所述,right根本不需要回退到left處,只需要先保持不對,對區間的和判斷之后,無非就是先left++,再right++或者直接right++罷了!

所以雙指針同向移動,采用滑動窗口來解決即可!

三:代碼

①:ret為操作數

class Solution {
public:int minOperations(vector<int>& nums, int x) {int ret=INT_MAX;//ret代表操作數 要返回最小的int targe=0;//查找區間的和int sum=0;//數組的總和for(auto a:nums) sum+=a;targe=sum-x;//計算出窗口的目標和 賦給targeif(targe<0) return -1;//對情況3 x大于整個數組和 進行特判for(int left=0,right=0,total=0;right<nums.size();right++){total+=nums[right];//進窗口while(total>targe)//區間不符合我們的要求{total-=nums[left++];//出窗口}if(total==targe)//符合我們的要求ret=min(ret,(n-(right-left+1)));//則判斷更新ret 取最小操作數}return ret==INT_MAX?-1:ret;//有可能ret始終未更新 這就是情況2 反之就是情況1}
};

易錯:

①:情況3,x大于整個數組的情況,一定要在執行滑動窗口算法的之前進行特判,否則while循環中的total一定大于targe,這意味著不管你怎么出窗口,你的left會一直++,直到越界,會報錯

②:ret代表的是最小操作數,所以博主一開始就取了INT_MAX,其次即使不是情況3,也有可能是情況2,所以ret可能從未被更新,仍為INT_MAX,所以若是為INT_MAX,則返回-1,返回代表情況1,直接返回ret就行

③:像left right toal,這種只需要在循環中用到的變量,直接在for循環定義就行,反之其他的變量,不能再for循環中定義

④:更新結果的前提一定是窗口區間的和total==targe,而不是直接更新

⑤:ret代表操作數,所以我們更新ret的時候,是數組總長度-窗口區間長度得到的

有些寫法定義ret為符合要求的窗口區間的長度,所以在返回的時候,有一些變化

②:ret為區間長度

class Solution {
public:int minOperations(vector<int>& nums, int x) {int sum = 0;for (auto a : nums) sum += a;int target = sum - x;// 情況3if (target < 0) return -1;int ret = -1; // 初始化結果為 -1(表示暫時無解)// 滑動窗口:尋找和為 target 的最長子數組for (int left = 0, right = 0, tmp = 0; right < nums.size(); right++) {tmp += nums[right];  // 進窗口while (tmp > target) // 窗口不符合要求tmp -= nums[left++]; // 出窗口if (tmp == target)  // 判斷更新ret = max(ret, right - left + 1); // 更新最大窗口長度}// 對情況2特判一下子if (ret == -1) return ret;else return nums.size() - ret;//ret是區間長度 所以操作數應該為總長度減去區間長度}
};

解釋:ret是區間長度,所以判斷更新的時候輕松一點,但是最后返回的時候麻煩一點

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

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

相關文章

CentOS 7 下通過 Anaconda3 運行llm大模型、deepseek大模型的完整指南

CentOS 7 下通過 Anaconda3 運行llm大模型、deepseek大模型的完整指南A1 CentOS 7 下通過 Anaconda3 運行大模型的完整指南一、環境準備二、創建專用環境三、模型部署與運行四、優化配置常見問題解決B1 CentOS 7 下通過 Anaconda3 使用 CPU 運行 DeepSeek 大模型的完整方案一、…

Flutter應用在Windows 8上正常運行

要讓Flutter應用在Windows 8上正常運行,需滿足以下前提條件,涵蓋系統環境、依賴配置、編譯設置等關鍵環節: 一、系統環境基礎要求 Windows 8版本 必須是 Windows 8.1(核心支持),不支持早期Windows 8(需升級到8.1,微軟已停止對原版Windows 8的支持)。 確認系統版本:右…

Redis實現消息隊列三種方式

參考 Redis隊列詳解&#xff08;springboot實戰&#xff09;_redis 隊列-CSDN博客 前言 MQ消息隊列有很多種&#xff0c;比如RabbitMQ,RocketMQ,Kafka等&#xff0c;但是也可以基于redis來實現&#xff0c;可以降低系統的維護成本和實現復雜度&#xff0c;本篇介紹redis中實現…

【C++動態版本號生成方案:實現類似C# 1.0.* 的自動構建號】

C動態版本號生成方案&#xff1a;實現類似C# 1.0.* 的自動構建號 在C#中&#xff0c;1.0.*版本號格式會在編譯時自動生成構建號和修訂號。本文將介紹如何在C項目中實現類似功能&#xff0c;通過MSBuild自動化生成基于編譯時間的版本號。 實現原理 版本號構成&#xff1a;主版本…

【算法題】:斐波那契數列

用 JavaScript 實現一個 fibonacci 函數&#xff0c;滿足&#xff1a; 輸入 n&#xff08;從0開始計數&#xff09;輸出第 n 個斐波那契數&#xff08;斐波那契數列從 1 開始&#xff1a;1,1,2,3,5,8,13,21…&#xff09; 示例&#xff1a; fibonacci(0) > 1fibonacci(4) &g…

【YOLOv13[基礎]】熱力圖可視化實踐 | 腳本升級 | 優化可視化效果 | 論文必備 | GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM等

本文將進行添加YOLOv13版本的升級版熱力圖可視化功能的實踐,支持圖像熱力圖可視化、優化可視化效果、 可以選擇使用GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiResCAM, LayerCAM, RandomCAM, EigenGradCAM。一個參數即可設置是否顯示檢測框等。 原圖 結果圖

ElasticSearch相關術語介紹

1.RESTful風格程序REST(英文全稱為:"Representational State Transfer")指的是一組架構約束條件和原則。它是一種軟件架構風格&#xff08;約束條件和原則的集合&#xff0c;但并不是標準&#xff09;。 REST通過資源的角度觀察網絡&#xff0c;以URI對網絡資源進行…

《從零構建大語言模型》學習筆記4,注意力機制1

《從零構建大語言模型》學習筆記4&#xff0c;自注意力機制1 文章目錄《從零構建大語言模型》學習筆記4&#xff0c;自注意力機制1前言一、實現一個簡單的無訓練權重的自注意力機制二、實現具有可訓練權重的自注意力機制1. 分步計算注意力權重2.實現自注意力Python類三、將單頭…

昇思+昇騰開發板+DeepSeek模型推理和性能優化

昇思昇騰開發板DeepSeek模型推理和性能優化 模型推理 流程&#xff1a; 權重加載 -> 啟動推理 -> 效果比較與調優 -> 性能測試 -> 性能優化 權重加載 如微調章節介紹&#xff0c;最終的模型包含兩部分&#xff1a;base model 和 LoRA adapter&#xff0c;其中base …

未給任務“Fody.WeavingTask”的必需參數“IntermediateDir”賦值。 WpfTreeView

c#專欄記錄&#xff1a; 報錯 未給任務“Fody.WeavingTask”的必需參數“IntermediateDir”賦值。 WpfTreeView 生成 解決辦法 清理和重新生成項目 完成上述配置后&#xff0c;嘗試執行以下步驟&#xff1a; 清理項目&#xff1a;刪除 bin 和 obj 文件夾。 重新生成項目&…

[Linux]學習筆記系列 -- [arm][lib]

文章目錄arch/arm/lib/delay.cregister_current_timer_delay 注冊當前定時器延遲read_current_timer 讀取當前定時器drivers/clocksource/timer-stm32.cstm32_clocksource_init STM32 平臺上初始化時鐘源https://github.com/wdfk-prog/linux-study arch/arm/lib/delay.c regis…

harbor倉庫搭建(配置https)

目錄 1. 環境準備 2. 配置https的原因 3. 生成ca證書 4. 搭建harbor倉庫 5. 訪問harbor 6. 修改加密算法 1. 環境準備 需要提前安裝docker和docker-compose&#xff0c;harbor倉庫版本越新&#xff0c;對應的docker和docker-compose版本越新。 主機IP192.168.48.19dock…

C++多線程服務器

C多線程服務器 因為自己同時在看多本書&#xff0c;之前看過《TCP/IP 網絡編程》一書&#xff0c;其中有一個自己編寫一個多線程服務器的例子&#xff0c;于是就把代碼直接抄了一變。 在學習網絡編程前需要先了解網絡的7層模型。 具體代碼如下&#xff1a; 服務器端&#xff1a…

【Pandas】常用數據處理技巧

一. 數據讀取 1.pd.to_csv & pd.read_csv 細節&#xff1a; 1.pd.read_csv 需要 ignore_index True or ,index_col0 否則會有列Unnamed0 2.pickle具有更快的讀取速度&#xff0c;與更小的體積。 讀取前N行&#xff08;若不需獲取所有數據&#xff09; pd.read_csv(…

Docker Compose 部署高可用 MongoDB 副本集集群(含 Keepalived + HAProxy 負載均衡)

Docker Compose 部署高可用 MongoDB 副本集集群&#xff08;含 Keepalived HAProxy 負載均衡&#xff09;背景與目標&#x1f4cb; 環境規劃**服務器信息****軟件版本**部署步驟1. 創建目錄結構2、生成 keyFile&#xff08;三臺機器內容必須一致&#xff09;3. 準備 Keepalive…

MySQL(189)如何分析MySQL的鎖等待問題?

分析MySQL的鎖等待問題有助于發現和解決數據庫性能瓶頸。鎖等待問題通常會導致數據庫響應時間變長&#xff0c;影響系統的整體性能。以下是詳細深入的方法和代碼示例&#xff0c;幫助你分析和解決MySQL的鎖等待問題。 一、鎖的類型和概念 在MySQL中&#xff0c;主要有以下幾種鎖…

26.Scikit-learn實戰:機器學習的工具箱

Scikit-learn實戰&#xff1a;機器學習的工具箱 &#x1f3af; 前言&#xff1a;機器學習界的"宜家家具" 還記得第一次逛宜家的感受嗎&#xff1f;琳瑯滿目的家具&#xff0c;每一件都有詳細的說明書&#xff0c;組裝簡單&#xff0c;樣式統一&#xff0c;關鍵是—…

wordpress文章摘要調用的3種方法

以下是WordPress文章摘要的3種調用方法&#xff1a; 1. 使用the_excerpt()函數 這是WordPress自帶的函數&#xff0c;用于調用文章摘要。如果文章有手動填寫的摘要&#xff0c;則會顯示手動摘要;如果沒有手動摘要&#xff0c;WordPress會自動從文章內容中提取前55個單詞作為摘…

java excel轉圖片常用的幾種方法

十分想念順店雜可。。。在 Java 中實現 Excel 轉圖片&#xff0c;常用的方法主要分為兩類&#xff1a;使用商業庫&#xff08;簡單高效但可能收費&#xff09;和使用開源庫組合&#xff08;免費但實現復雜&#xff09;。以下是幾種常用方案及實現思路&#xff1a;一、使用商業庫…

QT項目 -仿QQ音樂的音樂播放器(第五節)

目錄 一、CommonPage界?設置和顯示 二、自定義ListItemBox 三、支持hover效果 四、自定義VolumeTool 五、界面設置 六、頁面創建及彈出 七、繪制三角 一、CommonPage界面設置和顯示 void CommonPage::setCommonPageUI(const QString &title, const QString &imag…