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] + 1
noFlip[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] + 1
noFlip[i]
必須使nums[i] = 1
, 但nums[i]
已經是1
, 故直接接上
➔noFlip[i] = noFlip[i - 1] + 1
3. 初始化:
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!
評論