LeetCode 熱題 100 53. 最大子數組和

LeetCode 熱題 100 | 53. 最大子數組和

大家好,今天我們來解決一道經典的算法題——最大子數組和。這道題在 LeetCode 上被標記為中等難度,要求我們找出一個具有最大和的連續子數組,并返回其最大和。下面我將詳細講解解題思路,并附上 Python 代碼實現。


題目描述

給定一個整數數組 nums,請你找出一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。

示例:

輸入:nums = [-2,1,-3,4,-1,2,1,-5,4]
輸出:6
解釋:連續子數組 [4,-1,2,1] 的和最大,為 6。

解題思路

這道題的核心是找到一個連續子數組,使得其和最大。我們可以使用 動態規劃分治法 來解決這個問題。

核心思想
  1. 動態規劃

    • 定義 dp[i] 表示以 nums[i] 結尾的子數組的最大和。
    • 狀態轉移方程:
      dp[i] = max(dp[i-1] + nums[i], nums[i])
    • 最終結果是 dp 數組中的最大值。
  2. 分治法

    • 將數組分成左右兩部分,分別求解左右部分的最大子數組和。
    • 求解跨越中間的最大子數組和。
    • 返回左部分、右部分和跨越中間的最大值。

代碼實現

方法 1:動態規劃
def maxSubArray(nums):""":type nums: List[int]:rtype: int"""n = len(nums)dp = [0] * ndp[0] = nums[0]  # 初始化 dp[0]max_sum = dp[0]  # 初始化最大和for i in range(1, n):dp[i] = max(dp[i-1] + nums[i], nums[i])  # 狀態轉移max_sum = max(max_sum, dp[i])  # 更新最大和return max_sum
方法 2:分治法
def maxSubArray(nums):""":type nums: List[int]:rtype: int"""def divide_and_conquer(left, right):if left == right:return nums[left]mid = (left + right) // 2# 分別求解左右部分的最大子數組和left_max = divide_and_conquer(left, mid)right_max = divide_and_conquer(mid + 1, right)# 求解跨越中間的最大子數組和left_sum = nums[mid]right_sum = nums[mid + 1]temp = left_sumfor i in range(mid - 1, left - 1, -1):temp += nums[i]left_sum = max(left_sum, temp)temp = right_sumfor i in range(mid + 2, right + 1):temp += nums[i]right_sum = max(right_sum, temp)cross_max = left_sum + right_sum# 返回左部分、右部分和跨越中間的最大值return max(left_max, right_max, cross_max)return divide_and_conquer(0, len(nums) - 1)

代碼解析

動態規劃
  1. 初始化

    • dp[0] 表示以 nums[0] 結尾的子數組的最大和,初始化為 nums[0]
    • max_sum 初始化為 dp[0]
  2. 狀態轉移

    • 對于每個 i,計算 dp[i],表示以 nums[i] 結尾的子數組的最大和。
    • 如果 dp[i-1] + nums[i]nums[i] 大,則繼續擴展子數組;否則,從 nums[i] 重新開始。
  3. 更新最大和

    • 每次計算 dp[i] 后,更新 max_sum
  4. 返回結果

    • 返回 max_sum
分治法
  1. 遞歸終止條件

    • 如果 left == right,返回 nums[left]
  2. 遞歸求解左右部分

    • 分別遞歸求解左部分和右部分的最大子數組和。
  3. 求解跨越中間的最大子數組和

    • 從中間向左右擴展,求解跨越中間的最大子數組和。
  4. 返回最大值

    • 返回左部分、右部分和跨越中間的最大值。

復雜度分析

  • 時間復雜度

    • 動態規劃:O(n),其中 n 是數組的長度。我們只需要遍歷數組一次。
    • 分治法:O(n log n),每次遞歸將數組分成兩部分,遞歸深度為 log n,每層需要 O(n) 的時間求解跨越中間的最大子數組和。
  • 空間復雜度

    • 動態規劃:O(n),需要額外的 dp 數組。
    • 分治法:O(log n),遞歸調用棧的深度為 log n。

示例運行

示例 1
# 輸入:nums = [-2,1,-3,4,-1,2,1,-5,4]
nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
print(maxSubArray(nums))  # 輸出: 6
示例 2
# 輸入:nums = [1]
nums = [1]
print(maxSubArray(nums))  # 輸出: 1
示例 3
# 輸入:nums = [5,4,-1,7,8]
nums = [5, 4, -1, 7, 8]
print(maxSubArray(nums))  # 輸出: 23

總結

通過動態規劃或分治法,我們可以高效地找到最大子數組和。動態規劃的時間復雜度為 O(n),是最優的解法;分治法的時間復雜度為 O(n log n),適合理解分治思想。希望這篇題解對你有幫助!如果還有其他問題,歡迎繼續提問!

關注我,獲取更多算法題解和編程技巧!

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

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

相關文章

【計算機網絡入門】初學計算機網絡(九)

目錄 1.令牌傳遞協議 2. 局域網&IEEE802 2.1 局域網基本概念和體系結構 3. 以太網&IEEE802.3 3.1 MAC層標準 3.1.1 以太網V2標準 ?編輯 3.2 單播廣播 3.3 沖突域廣播域 4. 虛擬局域網VLAN 1.令牌傳遞協議 先回顧一下令牌環網技術,多個主機形成…

Java 大視界 -- Java 大數據中的時間序列數據異常檢測算法對比與實踐(103)

💖親愛的朋友們,熱烈歡迎來到 青云交的博客!能與諸位在此相逢,我倍感榮幸。在這飛速更迭的時代,我們都渴望一方心靈凈土,而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識,也…

Android Activity棧關系解析

在 Android 系統中,這些類共同構成了 Activity 任務棧管理的核心架構。它們的關系可以類比為一棟大樓的管理體系,每個類負責不同層級的任務。以下是它們的詳細解釋和實際場景示例: 1. ActivityRecord(活動記錄) 是什么…

【0011】HTML其他文本格式化標簽詳解(em標簽、strong標簽、b標簽、i標簽、sup標簽、sub標簽......)

如果你覺得我的文章寫的不錯&#xff0c;請關注我喲&#xff0c;請點贊、評論&#xff0c;收藏此文章&#xff0c;謝謝&#xff01; 本文內容體系結構如下&#xff1a; 本文旨在深入探討HTML中其他的文本格式化標簽&#xff0c;主要有<em> 標簽、<strong> 標簽、…

華為AP 4050DN-HD的FIT AP模式改為FAT AP,家用FAT基本配置

在某魚買了兩臺華為AP 4050DN-HD , AP是二手的 , 在AC上上過線 , 所以就不能開機自選為FIP模式了 我沒有AC無線控制器 , 就是買一個自己玩 , AP又是FIT瘦AP模式 ,所以我就想把AP的瘦AP模式改為FAT胖AP模式 1. 準備工作 1.1下載好對應軟件&#xff0c;進入到 企業業務網站去下…

【Linux網絡-HTTP協議】HTTP基礎概念+構建HTTP

代碼定位&#xff1a;南毅c/Linux - Gitee.com HTTP協議 介紹 雖然我們說&#xff0c;應用層協議是我們程序猿自己定的.但實際上,已經有大佬們定義了一些現成的,又非常好用的應用層協議,供我們直接參考使用。HTTP(超文本傳輸協議)就是其中之一。 在互聯網世界中&#xff0c…

SpringSecurity 實現token 認證

配置類 Configuration EnableWebSecurity EnableGlobalMethodSecurity(prePostEnabledtrue) public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { Bean Override public AuthenticationManager authenticationManagerBean() throws Exception {return s…

基于互聯網協議的診斷通信(DoIP)

1、ISO 13400標準和其他汽車網絡協議標準有何不同&#xff1f; ISO 13400 標準即 DoIP 協議標準&#xff0c;與其他常見汽車網絡協議標準&#xff08;如 CAN、LIN、FlexRay 等&#xff09;有以下不同&#xff1a; 通信基礎與適用場景 ISO 13400&#xff1a;基于互聯網協議&a…

LabVIEW DataSocket 通信庫詳解

dataskt.llb 是 LabVIEW 2019 內置的核心函數庫之一&#xff0c;位于 vi.lib\Platform\ 目錄下&#xff0c;專注于 DataSocket 技術的實現。DataSocket 是 NI 提供的網絡通信協議&#xff0c;支持跨平臺、跨設備的實時數據共享&#xff0c;廣泛應用于遠程監控、分布式系統集成等…

Android 端側運行 LLM 框架 MNN 及其應用

MNN Chat Android App - 基于 MNN 引擎的智能聊天應用 一、MNN 框架簡介與工作原理1.1 什么是 MNN&#xff1f;1.2 MNN 的工作原理 二、MNN Chat Android App2.1 MNN Chat 的功能2.2 MNN Chat 的優勢2.3 MNN Chat Android App 的使用 三、總結 隨著移動端人工智能需求的日益增長…

ARM Linux LCD上實時預覽攝像頭畫面

文章目錄 1、前言2、環境介紹3、步驟4、應用程序編寫4.1、lcd初始化4.2、攝像頭初始化4.3、jpeg解碼4.4、開啟攝像頭4.5、完整的程序如下 5、測試5.1、編譯應用程序5.2、運行應用程序 6、總結 1、前言 本次應用程序主要針對支持MJPEG格式輸出的UVC攝像頭。 2、環境介紹 rk35…

[代碼規范]接口設計規范

一個優雅的接口要如何設計&#xff1f;有哪些設計規范可以遵循&#xff1f; 下面拋磚引玉&#xff0c;分享一些規范。 目錄 1、RESTful API 設計最佳實踐 2、Shneiderman 的 8 條黃金法則 3、Nielsen 的 10 條啟發式規則 1、RESTful API 設計最佳實踐 一共18條&#xff0c;參考…

如何在Python用Plot畫出一個簡單的機器人模型

如何在Python中使用 Plot 畫出一個簡單的模型 在下面的程序中&#xff0c;首先要知道機器人的DH參數&#xff0c;然后計算出每一個關節的位置&#xff0c;最后利用 plot 函數畫出關節之間的連桿就可以了&#xff0c;最后利用 animation 庫來實現一個動畫效果。 import matplo…

Spark核心之01:架構部署、sparkshell、程序模板

spark內存計算框架 一、主題 spark核心概念spark集群架構spark集群安裝部署spark-shell的使用通過IDEA開發spark程序 二、要點 1. spark是什么 Apache Spark? is a unified analytics engine for large-scale data processing. spark是針對于大規模數據處理的統一分析引擎…

如何通過Python網絡爬蟲技術應對復雜的反爬機制?

要使用Python網絡爬蟲技術繞過復雜的反爬蟲機制&#xff0c;可以采取以下幾種策略&#xff1a; 設置User-Agent&#xff1a;通過設置不同的User-Agent&#xff0c;模擬正常用戶的瀏覽器訪問&#xff0c;避免被網站識別為爬蟲。可以使用fake_useragent庫來隨機生成User-Agent。…

[Windows] 批量為視頻或者音頻生成字幕 video subtitle master 1.5.2

Video Subtitle Master 1.5.2 介紹 Video Subtitle Master 1.5.2 是一款功能強大的客戶端工具&#xff0c;能夠批量為視頻或音頻生成字幕&#xff0c;還支持批量將字幕翻譯成其他語言。該工具具有跨平臺性&#xff0c;無論是 mac 系統還是 windows 系統都能使用。 參考原文&a…

神經網絡代碼入門解析

神經網絡代碼入門解析 import torch import matplotlib.pyplot as pltimport randomdef create_data(w, b, data_num): # 數據生成x torch.normal(0, 1, (data_num, len(w)))y torch.matmul(x, w) b # 矩陣相乘再加bnoise torch.normal(0, 0.01, y.shape) # 為y添加噪聲…

DeepSeek 開源狂歡周(一)FlashMLA:高效推理加速新時代

上周末&#xff0c;DeepSeek在X平臺&#xff08;Twitter&#xff09;宣布將開啟連續一周的開源&#xff0c;整個開源社區為之沸騰&#xff0c;全球AI愛好者紛紛為關注。沒錯&#xff0c;這是一場由DeepSeek引領的開源盛宴&#xff0c;推翻了傳統推理加速的種種限制。這周一&…

EfficientViT模型詳解及代碼復現

核心架構 在EfficientViT模型的核心架構中,作者設計了一種創新的 sandwich布局 作為基礎構建塊,旨在提高內存效率和計算效率。這種布局巧妙地平衡了自注意力層和前饋神經網絡層的比例,具體結構如下: 基于深度卷積的Token Interaction :通過深度卷積操作對輸入特征進行初步…

大語言模型(LLM)如何賦能時間序列分析?

引言 近年來&#xff0c;大語言模型&#xff08;LLM&#xff09;在文本生成、推理和跨模態任務中展現了驚人能力。與此同時&#xff0c;時間序列分析作為工業、金融、物聯網等領域的核心技術&#xff0c;長期依賴傳統統計模型&#xff08;如ARIMA&#xff09;或深度學習模型&a…