數據結構與算法:子數組最大累加和問題及擴展

前言

子數組最大累加和問題看似簡單,但能延伸出的題目非常多,千題千面,而且會和其他算法結合出現。

一、最大子數組和

class Solution {
public:int maxSubArray(vector<int>& nums) {int n=nums.size();vector<int>dp(n);//i位置往左能延伸出的最大累加和dp[0]=nums[0];int ans=dp[0];for(int i=1;i<n;i++){dp[i]=max(nums[i],dp[i-1]+nums[i]);ans=max(ans,dp[i]);}return ans;}//擴展問題://求子數組最大累加和的left、right和sumint left;int right;int sum;void extra(vector<int>&nums){sum=INT_MIN;for(int l=0,r=0,pre=INT_MIN;r<nums.size();r++){if(pre>=0)//前面累加和收益為正 -> 不換開頭{pre+=nums[r];}else//換開頭{pre=nums[r];l=r;}if(pre>sum)//更新{sum=pre;left=l;right=r;}}}
};

這個就是經典的子數組最大累加和問題,這個和擴展問題求left和right非常重要,是整個子數組最大累加和專題的基礎!!

對于dp表的定義就是必須以i位置結尾,往左的子數組最大累加和。那么對于每個位置,都是當前的數加上要之前的和不要之前的兩種情況。

那么如果要求這個子數組的left和right,整體過程類似滑動窗口,就是在空間壓縮的基礎上,如果之前的累加和大于等于零,說明收益是正的,那就保留之前的,否則就不要之前的,然后把l更新到r位置。當累加和能更新最大值,就連著left和right一起更新。

二、打家劫舍

class Solution {
public:int rob(vector<int>& nums) {int n=nums.size();if(n==1){return nums[0];}if(n==2){return max(nums[0],nums[1]);}vector<int>dp(n);dp[0]=nums[0];dp[1]=max(nums[0],nums[1]);for(int i=2;i<n;i++){dp[i]=max(dp[i-1],max(nums[i],dp[i-2]+nums[i]));//dp[i]=max(dp[i-1],dp[i-2]+nums[i]);}return dp[n-1];}
};

這個題首先要注意的就是特例,當只有一間或者兩間的話直接返回。

之后就是分情況討論,如果上間偷了,這間就不能偷,那么依賴的就是dp[i-1];如果上間沒偷,那么就還有要之前的和不要之前的兩種情況,最后取三種情況最大值即可。

其實因為這個題每間房子的收益都是大于零的,那么就不用討論不要之前的這種情況了。

三、環形子數組的最大和

class Solution {
public:int maxSubarraySumCircular(vector<int>& nums) {int n=nums.size();int sum=nums[0],maxSum=nums[0],minSum=nums[0];int maxpre=nums[0],minpre=nums[0];for(int i=1;i<n;i++){sum+=nums[i];//統計總累加和maxpre=max(nums[i],maxpre+nums[i]);maxSum=max(maxSum,maxpre);minpre=min(nums[i],minpre+nums[i]);minSum=min(minSum,minpre);}return sum==minSum?maxSum:max(maxSum,sum-minSum);//防止都扣掉}
};

這個題就需要點轉化了,轉化的思路就是,由于是環形數組,那么在其中刪除任意一段子數組,剩下的仍連續,那么就可以將最大累加和轉化成總體累加和減去最小的累加和和最大累加和的最大值。

整體的依賴關系還是要之前的和不要之前的,但這里要統計最大累加和和最小累加和。注意,若整體累加和等于最小累加和,為了防止把數全扣了,此時要返回最大累加和,否則就是最大累加和和相減后的最大值。

四、打家劫舍 II

class Solution {
public:int rob(vector<int>& nums) {int n=nums.size();if(n==1){return nums[0];}vector<int>dp(n);//不偷第0間 -> 1~n-1dp[0]=0;dp[1]=nums[1];for(int i=2;i<=n-1;i++){dp[i]=max(dp[i-1],max(nums[i],dp[i-2]+nums[i]));}int p1=dp[n-1];//偷第0間 -> nums[0]+2~n-2fill(dp.begin(),dp.end(),0);dp[0]=nums[0];dp[1]=nums[0];//注意!!!只偷第0間時dp[

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

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

相關文章

MIT6.828 Lab3-2 Print a page table (easy)

實驗內容 實現一個函數來打印頁表的內容&#xff0c;幫助我們更好地理解 xv6 的三級頁表結構。 修改內容 kernel/defs.h中添加函數聲明&#xff0c;方便其它函數調用 void vmprint(pagetable_t);// lab3-2 Print a page tablekernel/vm.c中添加函數具體定義 采用…

2025高頻面試設計模型總結篇

文章目錄 設計模型概念單例模式工廠模式策略模式責任鏈模式 設計模型概念 設計模式是前人總結的軟件設計經驗和解決問題的最佳方案&#xff0c;它們為我們提供了一套可復用、易維護、可擴展的設計思路。 &#xff08;1&#xff09;定義&#xff1a; 設計模式是一套經過驗證的…

Java基礎:面向對象進階(二)

01-static static修飾成員方法 static注意事項&#xff08;3種&#xff09; static應用知識&#xff1a;代碼塊 static應用知識&#xff1a;單列模式 02-面向對象三大特征之二&#xff1a;繼承 什么是繼承&#xff1f; 使用繼承有啥好處? 權限修飾符 單繼承、Object類 方法重…

Spring框架如何做EhCache緩存?

在Spring框架中&#xff0c;緩存是一種常見的優化手段&#xff0c;用于減少對數據庫或其他資源的訪問次數&#xff0c;從而提高應用性能。Spring提供了強大的緩存抽象&#xff0c;支持多種緩存實現&#xff08;如EhCache、Redis、Caffeine等&#xff09;&#xff0c;并可以通過…

NVIDIA顯卡

NVIDIA顯卡作為全球GPU技術的標桿&#xff0c;其產品線覆蓋消費級、專業級、數據中心、移動計算等多個領域&#xff0c;技術迭代貫穿架構創新、AI加速、光線追蹤等核心方向。以下從技術演進、產品矩陣、核心技術、生態布局四個維度展開深度解析&#xff1a; 一、技術演進&…

【BUG】生產環境死鎖問題定位排查解決全過程

目錄 生產環境死鎖問題定位排查解決過程0. 表面現象1. 問題分析&#xff08;1&#xff09;數據庫連接池資源耗盡&#xff08;2&#xff09;數據庫鎖競爭(3) 代碼實現問題 2. 分析解決(0) 分析過程&#xff08;1&#xff09;優化數據庫連接池配置&#xff08;2&#xff09;優化數…

【計算機網絡應用層】

文章目錄 計算機網絡應用層詳解一、前言二、應用層的功能三、常見的應用層協議1. HTTP/HTTPS&#xff08;超文本傳輸協議&#xff09;2. DNS&#xff08;域名系統&#xff09;3. FTP&#xff08;文件傳輸協議&#xff09;4. SMTP/POP3/IMAP&#xff08;電子郵件協議&#xff09…

Linux 虛擬化方案

一、Linux 虛擬化技術分類 1. 全虛擬化 (Full Virtualization) 特點&#xff1a;Guest OS 無需修改&#xff0c;完全模擬硬件 代表技術&#xff1a; KVM (Kernel-based Virtual Machine)&#xff1a;主流方案&#xff0c;集成到 Linux 內核 QEMU&#xff1a;硬件模擬器&…

樹莓派 5 換清華源

首先備份原設置 cp /etc/apt/sources.list ~/sources.list.bak cp /etc/apt/sources.list.d/raspi.list ~/raspi.list.bak修改配置 /etc/apt/sources.list 文件替換內容如下&#xff08;原內容刪除&#xff09; deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm …

WGAN原理及實現(pytorch版)

WGAN原理及實現 一、WGAN原理1.1 原始GAN的缺陷1.2 Wasserstein距離的引入1.3 Kantorovich-Rubinstein對偶1.4 WGAN的優化目標1.4 數學推導步驟1.5 權重裁剪 vs 梯度懲罰1.6 優勢1.7 總結 二、WGAN實現2.1 導包2.2 數據加載和處理2.3 構建生成器2.4 構建判別器2.5 訓練和保存模…

Unity網絡開發基礎 (3) Socket入門 TCP同步連接 與 簡單封裝練習

本文章不作任何商業用途 僅作學習與交流 教程來自Unity唐老獅 關于練習題部分是我觀看教程之后自己實現 所以和老師寫法可能不太一樣 唐老師說掌握其基本思路即可,因為前端程序一般不需要去寫后端邏輯 1.認識Socket的重要API Socket是什么 Socket&#xff08;套接字&#xff0…

【linux】一文掌握 ssh和scp 指令的詳細用法(ssh和scp 備忘速查)

文章目錄 入門連接執行SCP配置位置SCP 選項配置示例ProxyJumpssh-copy-id SSH keygenssh-keygen產生鑰匙類型known_hosts密鑰格式 此快速參考備忘單提供了使用 SSH 的各種方法。 參考&#xff1a; OpenSSH 配置文件示例 (cyberciti.biz)ssh_config (linux.die.net) 入門 連…

真實筆試題

文章目錄 線程題樹的深度遍歷 線程題 實現一個類支持100個線程同時向一個銀行賬戶中存入一元錢.需通過同步機制消除競態條件,當所有線程執行完成后,賬戶余額必須精確等于100元 package com.itheima.thread;public class ShowMeBug {private double balance; // 賬戶余額priva…

2.2 路徑問題專題:LeetCode 63. 不同路徑 II

動態規劃解決LeetCode 63題&#xff1a;不同路徑 II&#xff08;含障礙物&#xff09; 1. 題目鏈接 LeetCode 63. 不同路徑 II 2. 題目描述 一個機器人位于 m x n 網格的左上角&#xff0c;每次只能向右或向下移動一步。網格中可能存在障礙物&#xff08;標記為 1&#xff…

2874. 有序三元組中的最大值 II

給你一個下標從 0 開始的整數數組 。nums 請你從所有滿足 的下標三元組 中&#xff0c;找出并返回下標三元組的最大值。 如果所有滿足條件的三元組的值都是負數&#xff0c;則返回 。i < j < k(i, j, k)0 下標三元組 的值等于 。(i, j, k)(nums[i] - nums[j]) * nums[k…

【論文筆記】Llama 3 技術報告

Llama 3中的頂級模型是一個擁有4050億參數的密集Transformer模型&#xff0c;并且它的上下文窗口長度可以達到128,000個tokens。這意味著它能夠處理非常長的文本&#xff0c;記住和理解更多的信息。Llama 3.1的論文長達92頁&#xff0c;詳細描述了模型的開發階段、優化策略、模…

JVM深入原理(一+二):JVM概述和JVM功能

目錄 1. JVM概述 1.1. Java程序結構 1.2. JVM作用 1.3. JVM規范和實現 2. JVM功能 2.1. 功能-編譯和運行 2.2. 功能-內存管理 2.3. 功能-即時編譯 1. JVM概述 1.1. Java程序結構 1.2. JVM作用 JVM全稱是Java Virtual Machine-Java虛擬機 JVM作用:本質上是一個運行在…

SQL Server Integration Services (SSIS) 服務無法啟動

問題現象&#xff1a; 安裝 SQL Server 2022 后&#xff0c;SQL Server Integration Services (SSIS) 服務無法啟動&#xff0c;日志報錯 “服務無法響應控制請求”&#xff08;錯誤代碼 1067&#xff09;或 “依賴服務不存在或已標記為刪除”。 快速診斷 檢查服務狀態與依賴項…

Spring Boot 定時任務的多種實現方式

&#x1f31f; 前言 歡迎來到我的技術小宇宙&#xff01;&#x1f30c; 這里不僅是我記錄技術點滴的后花園&#xff0c;也是我分享學習心得和項目經驗的樂園。&#x1f4da; 無論你是技術小白還是資深大牛&#xff0c;這里總有一些內容能觸動你的好奇心。&#x1f50d; &#x…

Java基礎之反射的基本使用

簡介 在運行狀態中&#xff0c;對于任意一個類&#xff0c;都能夠知道這個類的所有屬性和方法&#xff1b;對于任意一個對象&#xff0c;都能夠調用它的任意屬性和方法&#xff1b;這種動態獲取信息以及動態調用對象方法的功能稱為Java語言的反射機制。反射讓Java成為了一門動…