487. Max Consecutive Ones II
題目網址:https://leetcode.cn/problems/max-consecutive-ones-ii/
題意:給一 binary array
nums, 你最多能反轉一個0, 返回最大連續1的個數。

Solution 1:
想法:利用 DP
1. 定義狀態:
- 首先, 會在
nums前先加上一個0, 代表什麼元素都沒有的狀態flip[i]為nums[1:i]中某個元素反轉後,nums[i] = 1的最大連續1個數noFlip[i]為nums[1:i]中沒有任何元素反轉,nums[i] = 1的最大連續1個數2. 得到狀態轉移方程:
- 當
nums[i] == 0:
flip[i]必須使nums[i] = 1, 故將 flip 的次數用在nums[i]上
➔flip[i] = noFlip[i - 1] + 1noFlip[i]必須使nums[i] = 1, 但是在不 flip 的情況下,nums[i]不可能為1
➔noFlip[i] = 0- 當
nums[i] == 1:
flip[i]必須使nums[i] = 1, 但nums[i]已經是1, 故直接接上
➔flip[i] = flip[i - 1] + 1noFlip[i]必須使nums[i] = 1, 但nums[i]已經是1, 故直接接上
➔noFlip[i] = noFlip[i - 1] + 13. 初始化:
flip[0]、noFlip[0]:沒有任何元素時, 最大連續1個數為0
flip[1]:根據定義, 先將nums[1]取 flip, 然後計算nums[1] = 1的最大連續1個數
- 當
nums[1] = 0時, 先取 flip 得nums[1] = 1➔flip[1] = 1- 當
nums[1] = 1時, 先取 flip 得nums[1] = 0➔flip[1] = 0➔ 由上述得到
flip[1] = 1 - nums[1](nums[1]取 flip)
noFlip[1]:根據定義, 不做任何 flip, 然後計算nums[1] = 1的最大連續1個數
- 當
nums[1] = 0時 ➔noFlip[1] = 0- 當
nums[1] = 1時 ➔noFlip[1] = 1➔ 由上述得到
noFlip[1] = nums[1]
res:上述兩者中取較大者,max(flip[1], noFlip[1]) = max(1 - nums[1], nums[1]) = 1
class Solution { |
- time:$O(n)$ ➔ for loop
- space:$O(n)$ ➔
flip,noflip
Solution 2:
想法:改進 Solution 1, 由於
flip[i],noFlip[i]只會用到第i - 1次的狀態, 因此只需儲存上一次的狀態即可, 根本不需要開到 $O(n)$ space
class Solution { |
- time:$O(n)$ ➔ for loop
- space:$O(1)$ ➔ 只需常數空間
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論