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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

递推算法之滚动数组思维方式

發(fā)布時間:2025/3/12 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 递推算法之滚动数组思维方式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

概述

在算法的最終結(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
即最后的代碼為:

public int climbStairs(int n) {if (n==1) {return 1;}if (n==2) {return 2;}return climbStairs(n-1)+climbStairs(n-2); }

這種做法的好處就是比較直觀,但是方法的時間復(fù)雜度為 O(2n)O(2^{n})O(2n)
所以這里可以用到滾動數(shù)組的思想來進(jìn)行優(yōu)化:

public int climbStairs(int n) {int left = 0, right = 0, sum = 0;for (int i = 1;i<=n;i++) {left = right;right = sum;sum = left + right;}return sum; }

這樣做的時間復(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é)果的最大值即可:

public int maxSubArray(int[] nums) {int prev = 0;int max = nums[0];for (int i:nums) {prev = Math.max(prev+i, i);max = Math.max(prev, max);}return max; }

總結(jié)

以上是生活随笔為你收集整理的递推算法之滚动数组思维方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。