递推算法之滚动数组思维方式
概述
在算法的最終結(jié)果只用到本層與上一層的結(jié)果時, 可以使用滾動數(shù)組思想。
簡單的理解就是每次都使用固定的幾個存儲空間達(dá)到壓縮節(jié)省存儲空間的作用, 主要用在遞推算法中。示例1: 爬樓梯問題
假設(shè)你正在爬樓梯。需要 n 階你才能到達(dá)樓頂。每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?由題可知, 在爬上第 n 階樓梯時,可以爬 1 個或 2 個臺階, 即爬上最后一階臺階時,總辦法數(shù) = 最后一階臺階是 n-1 階與 最后一階臺階是 n-2 階的辦法數(shù)的和, 即狀態(tài)轉(zhuǎn)移方程為:
f(n)=f(n?1)+f(n?2)f(n)=f(n-1)+f(n-2)f(n)=f(n?1)+f(n?2)
接下來推算邊界條件,即:
f(1)=1,f(2)=2f(1)=1, f(2)=2f(1)=1,f(2)=2
即最后的代碼為:
這種做法的好處就是比較直觀,但是方法的時間復(fù)雜度為 O(2n)O(2^{n})O(2n)。
所以這里可以用到滾動數(shù)組的思想來進(jìn)行優(yōu)化:
這樣做的時間復(fù)雜度就降到了O(n)O(n)O(n)。
示例2: 最大子序和
給定一個整數(shù)數(shù)組 nums ,找到一個具有最大和的連續(xù)子數(shù)組(子數(shù)組最少包含一個元素),返回其最大和。由題可知, 第 n 個元素的結(jié)果與第 n-1 個元素的結(jié)果以及第 n 個元素的大小有關(guān)系, 即:
f(n)=Max(f(n?1)+nums[n],nums[n])f(n) = Max(f(n-1)+nums[n], nums[n])f(n)=Max(f(n?1)+nums[n],nums[n])
所以, 問題的解法即遍歷數(shù)組中所有元素的并求出這些元素對應(yīng)結(jié)果的最大值即可:
總結(jié)
以上是生活随笔為你收集整理的递推算法之滚动数组思维方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于UDP的服务器端和客户端
- 下一篇: 前后端分离时代,Java 程序员的变与不