日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态规划套路:最大子数组和

發布時間:2024/4/11 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划套路:最大子数组和 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

動態規劃套路:最大子數組和

文章目錄

  • 動態規劃套路:最大子數組和
    • 一、題目描述
    • 二、分析

一、題目描述

這次看一個簡答的題:

二、分析

這道題比較簡單,主要是回顧動態 規劃的解法!

  • 其實第一次看到這道題,我首先想到的是滑動窗口算法,因為我們說過,滑動窗口算法就是專門處理子串/子數組問題的,這里不就是子數組問題么?
  • 但是,稍加分析就發現,這道題還不能用滑動窗口算法,因為數組中的數字可以是負數。
  • 動窗口算法無非就是雙指針形成的窗口掃描整個數組/子串,但關鍵是,你得清楚地知道什么時候應該移動右側指針來擴大窗口,什么時候移動左側指針來減小窗口。
  • 而對于這道題目,你想想,當窗口擴大的時候可能遇到負數,窗口中的值也就可能增加也可能減少,這種情況下不知道什么時機去收縮左側窗口,也就無法求出「最大子數組和」。
  • 解決這個問題需要動態規劃技巧,但是dp數組的定義比較特殊。按照我們常規的動態規劃思路,一般是這樣定義dp數組:

nums[0..i]中的「最大的子數組和」為dp[i]

  • 如果這樣定義的話,整個nums數組的「最大子數組和」就是dp[n-1]。如何找狀態轉移方程呢?按照數學歸納法,假設我們知道了dp[i-1],如何推導出dp[i]呢?
  • 如下圖,按照我們剛才對dp數組的定義,dp[i] = 5,也就是等于nums[0…i]中的最大子數組和:
  • 那么在上圖這種情況中,利用數學歸納法,你能用dp[i]推出dp[i+1]嗎?
  • 實際上是不行的,因為子數組一定是連續的,按照我們當前dp數組定義,并不能保證nums[0..i]中的最大子數組與nums[i+1]是相鄰的,也就沒辦法從dp[i]推導出dp[i+1]。
  • 所以說我們這樣定義dp數組是不正確的,無法得到合適的狀態轉移方程。對于這類子數組問題,我們就要重新定義dp數組的含義:

以nums[i]為結尾的「最大子數組和」為dp[i]。

  • 這種定義之下,想得到整個nums數組的「最大子數組和」,不能直接返回dp[n-1],而需要遍歷整個dp數組:
int res = Integer.MIN_VALUE; for (int i = 0; i < n; i++) {res = Math.max(res, dp[i]); } return res;
  • 依然使用數學歸納法來找狀態轉移關系:假設我們已經算出了dp[i-1],如何推導出dp[i]呢?
  • 可以做到,dp[i]有兩種「選擇」,要么與前面的相鄰子數組連接,形成一個和更大的子數組;要么不與前面的子數組連接,自成一派,自己作為一個子數組。
  • 如何選擇?既然要求「最大子數組和」,當然選擇結果更大的那個啦:
// 要么自成一派,要么和前面的子數組合并 dp[i] = Math.max(nums[i], nums[i] + dp[i - 1]);

綜上,我們已經寫出了狀態轉移方程,就可以直接寫出解法了:

int maxSubArray(int[] nums) {int n = nums.length;if (n == 0) return 0;int[] dp = new int[n];// base case// 第一個元素前面沒有子數組dp[0] = nums[0];// 狀態轉移方程for (int i = 1; i < n; i++) {dp[i] = Math.max(nums[i], nums[i] + dp[i - 1]);}// 得到 nums 的最大子數組int res = Integer.MIN_VALUE;for (int i = 0; i < n; i++) {res = Math.max(res, dp[i]);}return res; }

以上解法時間復雜度是 O(N),空間復雜度也是 O(N),較暴力解法已經很優秀了,不過注意到dp[i]僅僅和dp[i-1]的狀態有關,那么我們可以進行「狀態壓縮」,將空間復雜度降低:

int maxSubArray(int[] nums) {int n = nums.length;if (n == 0) return 0;// base caseint dp_0 = nums[0];int dp_1 = 0, res = dp_0;for (int i = 1; i < n; i++) {// dp[i] = max(nums[i], nums[i] + dp[i-1])dp_1 = Math.max(nums[i], nums[i] + dp_0);dp_0 = dp_1;// 順便計算最大的結果res = Math.max(res, dp_1);}return res;

總結

以上是生活随笔為你收集整理的动态规划套路:最大子数组和的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 蜜桃精品在线 | 久久爱一区 | www黄色com| 日本一级做a爱片 | 成人免费无遮挡无码黄漫视频 | 撸撸在线视频 | 97精品在线观看 | 日韩精品一区二区三区中文字幕 | 手机看片国产日韩 | 亚洲av无码一区二区乱子伦as | 精品欧美激情精品一区 | 2021狠狠干 | 超碰干 | 成人在线国产 | www,五月天,com| 97九色 | 亚洲黄色第一页 | 天美乌鸦星空mv | jzzjzz日本丰满成熟少妇 | 国产成人自拍视频在线 | 最新91视频 | 免费久久av| 激情视频网站在线观看 | 欧美激情 在线 | 亚洲精品福利在线 | 91视频首页 | 亚洲国产精彩视频 | www.av日韩| a免费视频| 国产欧美日韩综合精品一区二区三区 | 成年女人毛片 | 亚洲av无一区二区三区怡春院 | 91精品人妻一区二区三区 | 美女啪啪av | 天天澡天天狠天天天做 | 免费日b视频 | 亚洲狠狠丁香婷婷综合久久久 | 在线观看高清视频 | 成人影片在线 | 黄色一级免费 | 中文字幕在线观看视频www | 久青草视频在线观看 | 色老头一区二区 | 青青艹在线视频 | 欧洲精品免费一区二区三区 | 欧美自拍一区 | 九色视频偷拍少妇的秘密 | 国产精品久久在线观看 | 红桃视频网站 | 成人综合激情网 | 国产精品婷婷 | 淫片在线| 国产精品无码电影 | 精品成人av一区二区在线播放 | 日韩免费在线 | 欧美日韩不卡一区二区三区 | 免费成人深夜在线观看 | 3d动漫精品啪啪一区二区下载 | 久久成人免费网站 | 最新av网站在线观看 | 久久丫精品 | 一区二区三区四区五区在线视频 | 在线观看中文字幕第一页 | 国产精品午夜影院 | 国产精品.www | 波多野结衣91 | av国产一区| 午夜精品视频一区 | 91在线观看免费 | 波多野结衣电车痴汉 | 伦伦影院午夜理伦片 | 久久久久久久久久久影院 | 一级片久久久 | 久久狠 | 手机看片午夜 | 日韩一二三区在线观看 | 爱情岛论坛亚洲品质自拍视频 | 小日子的在线观看免费第8集 | 91av久久久 | 777精品伊人久久久久大香线蕉 | 91视频首页| 日韩免费在线观看 | 俺去久久 | 午夜av影视| aaa一区二区| 91学生片黄 | 在线岛国 | 最近的中文字幕 | www.婷婷| 久久精品免费 | 欧美人喂奶吃大乳 | 97伊人超碰| 韩国甜性涩爱 | 在线中文字日产幕 | 黄色三级图片 | 久久这里只有精品久久 | a毛片在线观看 | 两口子交换真实刺激高潮 | 色不卡 |