算法(27)-最大系列

最大系列

  • 1.LeetCode-239 滑動窗口的最大值
  • 2.LeetCode-53 連續子數組的最大和
  • 3.LeetCode-152 乘積最大的子數組。
  • 4.劍指 Offer 14- I. 剪繩子為k個整數段,使各個段成績最大
    • 1.dp
    • 數學推導

1.LeetCode-239 滑動窗口的最大值

窗口由左往右最大值數組Left,和由右向左最大值數組right維護。

在這里插入代碼片
    def maxSlidingWindow(self, nums: 'List[int]', k: 'int') -> 'List[int]':n = len(nums)if n * k == 0:return []if k == 1:return numsleft = [0] * nleft[0] = nums[0]right = [0] * nright[n - 1] = nums[n - 1]for i in range(1, n):# from left to rightif i % k == 0:# block startleft[i] = nums[i]else:left[i] = max(left[i - 1], nums[i])# from right to leftj = n - i - 1    # i = 1, j = n-2if (j + 1) % k == 0:# block endright[j] = nums[j]else:right[j] = max(right[j + 1], nums[j])output = []for i in range(n - k + 1): # i=[0,n-k)output.append(max(left[i + k - 1], right[i]))return output

2.LeetCode-53 連續子數組的最大和

借助連續性,如果某一塊的和為負數,這一塊不會作為和最大連續子數組的開頭,因為去掉這個部分,后半段加和會更大。
動態規劃的解題思路:dp[i] 以nums[i]結尾的連續子數組的最大和,dp[i] 只與dp[i-1]有關,空間約減后,空間復雜度為0(1)

    def maxSubArray(self, nums):""":type nums: List[int]:rtype: int"""res = float("-INF")dp = 0for val in nums:dp += val        # [-1]  先加,更新答案,確定是否歸零res = max(dp, res)dp = max(dp, 0)return res

3.LeetCode-152 乘積最大的子數組。

給你一個整數數組 nums ,請你找出數組中乘積最大的連續子數組(該子數組中至少包含一個數字),并返回該子數組所對應的乘積。

直接思路:fmax(i)f_{max}(i)fmax?(i)表示以第i個元素結尾的乘積最大的子數組的積,狀態轉移方程為
fmax(i)=max?i=1n{f(i?1)?ai,ai}f_{max}(i)=\max_{i=1}^n\{f(i-1)*a_i,a_i\} fmax?(i)=i=1maxn?{f(i?1)?ai?,ai?}
即,fmax(i)f_{max}(i)fmax?(i)可以考慮nums[i]加入前面fmax(i?1)f_{max}(i-1)fmax?(i?1)對應的一段,或者自成一段,這兩種情況取最大值,求出所有的f_i之后,選取一個最大的作為結果。

核心問題:當前位置的最優解不一定是由前一個位置的最優解得到。因為存在正負數

如果當前的數是負數的話,我們希望以num[i-1]為結尾的某一個段的積也是一個負數,負負可以為正。

如果當前數為正,我們希望以num[i-1]為結尾的某一個段的積也是一個正數,正的越多,乘積完越大。

所以再維護一個fmin(i)f_{min}(i)fmin?(i)表示以第i個元素結尾的乘積最小的子數組的積:
fmax(i)=max?{fmax(i?1)?ai,fmin(i?1)?ai,ai}fmin(i)=min?{fmax(i?1)?ai,fmin(i?1)?ai,ai}f_{max}(i)=\max\{f_{max}(i-1)*a_i,f_{min}(i-1)*a_i,a_i\}\\ f_{min}(i)=\min\{f_{max}(i-1)*a_i,f_{min}(i-1)*a_i,a_i\}fmax?(i)=max{fmax?(i?1)?ai?,fmin?(i?1)?ai?,ai?}fmin?(i)=min{fmax?(i?1)?ai?,fmin?(i?1)?ai?,ai?}

def maxProduct(self, nums):""":type nums: List[int]:rtype: int"""pre_max, pre_min = 1, 1res = float("-INF")for val in nums:cur_max = max(pre_max * val, pre_min * val, val)cur_min = min(pre_max * val, pre_min * val, val)pre_max, pre_min = cur_max, cur_minres = max(res, cur_max)return res

4.劍指 Offer 14- I. 剪繩子為k個整數段,使各個段成績最大

給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段(m、n都是整數,n>1并且m>1),每段繩子的長度記為 k[0],k[1]…k[m-1] 。請問 k[0]k[1]…*k[m-1] 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到的最大乘積是18。

1.dp

dp[i]: 長度為i 繩子至少剪了一次的最長長度
dp[i]=max(dp[j]?(i?j),j?(i?j),dp[i]),j∈[1,i?1]dp[i] = max(dp[j]*(i-j),j*(i-j),dp[i]),j\in[1,i-1]dp[i]=max(dp[j]?(i?j),j?(i?j),dp[i]),j[1,i?1]

class Solution(object):def cuttingRope(self, n):""":type n: int:rtype: int"""dp = [0]*(n+1)dp[1] = 1for i in range(2,n+1):for j in range(1,i):dp[i]= max(dp[i],dp[j]*(i-j),j*(i-j))return dp[-1]

n^2復雜度的DP

數學推導

通過數學不等式推到,可以得到,當每段長度為3時乘積最大。所以盡可能分為三段,最后一段依據具體情況判斷:

class Solution(object):def cuttingRope(self, n):""":type n: int:rtype: int"""if n<=3:return n-1s, mod = n //3, n % 3   if mod == 0:res = 3**selif mod == 1:res = 3**(s-1)*4 else:res = 3**s*2return res%(10**9+7)

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

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

相關文章

mysql數據庫表的導入導出

MySQL寫入數據通常用insert語句&#xff0c;如 復制代碼 代碼如下: insert into person values(張三&#xff0c;20)&#xff0c;&#xff08;李四&#xff0c;21&#xff09;&#xff0c;&#xff08;王五&#xff0c;70&#xff09;…; 但有時為了更快速地插入大批量數據或…

leetcode 33 搜索旋轉排序數組 到處是細節的好題

這個題想了想就會做&#xff0c;只是細節真的能卡死人&#xff0c;找了好久的bug。甚至我懷疑我現在的代碼可能還有錯&#xff0c;只是沒例子測出來。 假設按照升序排序的數組在預先未知的某個點上進行了旋轉。 ( 例如&#xff0c;數組 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1…

多線程中局部靜態變量初始化的陷阱

C當中常常需要一個全局唯一的對象實例&#xff0c;這時候&#xff0c;我們就會想到單件模式。如何實現這一模式&#xff1f;全局變量當然是一個簡單可行的方法&#xff0c;然而&#xff0c;這太丑陋。嗯&#xff0c;其實&#xff0c;丑陋倒也罷了&#xff0c;最嚴重的是它將引誘…

MachineLearning(8)-PCA,LDA基礎+sklearn 簡單實踐

PCA,LDA基礎sklearn 簡單實踐1.PCAsklearn.decomposition.PCA1.PCA理論基礎2.sklearn.decomposition.PCA簡單實踐2.LDAsklearn.discriminant_analysis.LinearDiscriminantAnalysis2.1 LDA理論基礎2.2 sklearn LDA簡單實踐1.PCAsklearn.decomposition.PCA 1.PCA理論基礎 PCA:&…

引用變量和引用數組

前兩天沒事干,重拾C++的一些書籍,翻到引用這,無意寫了些DD: 其實引用和指針有很多相似的地方,又有不同的(太多了,不過說到效率上,比如函數傳參數,我們可以用引用,指針,哪種好呢,引用不必為站再分配空間了,而指針還學要分配4字節的空間給指針變量) 我們知道如何…

leetcode198 打家劫舍

你是一個專業的小偷&#xff0c;計劃偷竊沿街的房屋。每間房內都藏有一定的現金&#xff0c;影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統&#xff0c;如果兩間相鄰的房屋在同一晚上被小偷闖入&#xff0c;系統會自動報警。 給定一個代表每個房屋存放金額的…

linux下的RPC

一、概述 在傳統的編程概念中&#xff0c;過程是由程序員在本地編譯完成&#xff0c;并只能局限在本地運行的一段代碼&#xff0c;也即其主程序和過程之間的運行關系是本地調用關系。因此這種結構在網絡日益發展的今天已無法適應實際需求。總而言之&#xff0c;傳統過程調用模式…

算法(28)--矩陣搜索系列

矩陣搜索1.leetcode-200. 島嶼數量2.leetcode-695. 島嶼的最大面積3.leetcode-463. 島嶼的周長4.劍指 Offer 12. 矩陣中的路徑5.leetcode-329. 矩陣中的最長遞增路徑6.leetcode-1091. 二進制矩陣中的最短路徑1.leetcode-200. 島嶼數量 給你一個由 ‘1’&#xff08;陸地&#…

leetcode213 打家劫舍II

你是一個專業的小偷&#xff0c;計劃偷竊沿街的房屋&#xff0c;每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈&#xff0c;這意味著第一個房屋和最后一個房屋是緊挨著的。同時&#xff0c;相鄰的房屋裝有相互連通的防盜系統&#xff0c;如果兩間相鄰的房屋在同一晚…

linux下安裝boost

以下是在ubuntu 7.10 (內核 2.6.22-14)下安裝的例子&#xff1a; 一、下載最新的 boost 庫&#xff0c;下載地址&#xff1a; http://www.boost.org/users/download/ 二、在適當的位置解壓 boost 庫&#xff0c;推薦把 boost 庫解壓到 /usr/local/ 下&#xff1a; $ cd dowlo…

PaperNotes(4)-高質量圖像生成-CGAN-StackGAN-Lapgan-Cyclegan-Pix2pixgan

cgan,stackgan,lapgan,cyclegan,pix2pixgan1.Conditional GAN1.1簡介1.2網絡結構與訓練1.3特點與用途2.Stack GAN2.1簡介2.2網絡結構與訓練2.3特點與用途3.Lap GAN3.1簡介3.2網絡結構與訓練3.3特點與用途4.Pix2pix GAN4.1 簡介4.2 網絡結構和訓練4.3 特點和用途5.Patch GAN6.Cy…

關于c++的一些案例

之前做項目的時候,有時候會用到位,也就是將一些數據放在二進制里,然后存在數據庫中或者緩存在服務器上,取出來,然后要判斷某位是不是置0或1,然后再將某位置0或1(比如領多個獎勵的 游戲邏輯),之前有點傻,竟然用 << ,>>這些運算符計算,今天翻起以前好久不…

C++(1)--概況、開發工具、hello word

簡介1. 概況2. 開發工具3. mac 寫hello word4. c 基本概念5.兩個數相加代碼分解5.1編譯預處理命令# include5.2輸入輸出庫iostream6.注釋7.編碼規范《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》1. 概況 20世紀70年代&a…

class 和 struct的區別

C中的struct對C中的struct進行了擴充&#xff0c;它已經不再只是一個包含不同數據類型的數據結構了&#xff0c;它已經獲取了太多的功能。 struct能包含成員函數嗎&#xff1f; 能&#xff01; struct能繼承嗎&#xff1f; 能&#xff01;&#xff01; struct能實現多態嗎&…

leetcode206 反轉鏈表

反轉一個單鏈表。 示例: 輸入: 1->2->3->4->5->NULL 輸出: 5->4->3->2->1->NULL 進階: 你可以迭代或遞歸地反轉鏈表。你能否用兩種方法解決這道題&#xff1f; 經典題不解釋 /*** Definition for singly-linked list.* public class ListNode…

淺議柔性數組

很多時候,柔性數組應用在了變長結構體中,如: StructPacket {Int state; Int len;

leetcode 152 乘積最大子序列

給定一個整數數組 nums &#xff0c;找出一個序列中乘積最大的連續子序列&#xff08;該序列至少包含一個數&#xff09;。 示例 1: 輸入: [2,3,-2,4] 輸出: 6 解釋: 子數組 [2,3] 有最大乘積 6。 示例 2: 輸入: [-2,0,-1] 輸出: 0 解釋: 結果不能為 2, 因為 [-2,-1] 不是子…

PaperNotes(5)-Conditional Generative Adversarial Nets

Conditional GAN 論文閱讀筆記Abstract1 Introduction2 Related Work3 Conditional Adversarial Nets3.1 Generative Adversarial Nets3.2 Conditional Adversarial Nets4 Experimental Results4.1 Unimodal4.2 Multimodal5 Future Work6.思考文章地址&#xff1a;https://arxi…

蛙泳姿勢教學

偶爾看到分享的一篇日志&#xff0c;記錄下&#xff0c;忙過這段時間努力學蛙泳。 蛙泳配合有一個順口溜&#xff0c;在講解蛙泳動作要領之前先介紹給大家&#xff1a;“劃手腿不動&#xff0c;收手再收腿&#xff0c;先伸胳膊后蹬腿&#xff0c;并攏伸直漂一會兒。”從順口溜中…

leetcode238 除本身以外數組的乘積

給定長度為 n 的整數數組 nums&#xff0c;其中 n > 1&#xff0c;返回輸出數組 output &#xff0c;其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積。 示例: 輸入: [1,2,3,4] 輸出: [24,12,8,6] 說明: 請不要使用除法&#xff0c;且在 O(n) 時間復雜度內完…