474. Ones and Zeroes
題目網址:https://leetcode.cn/problems/ones-and-zeroes/
題意:給一二進制 string array
strs
和兩整數m
和n
。給你
m
個0
和n
個1
, 求最多可以組成幾個strs
中的 string。
Solution 1:
想法:利用 DP, 本題有兩種容量(
0
、1
數量), 因此使用三維 DP1. 定義狀態:
- 首先, 會在
strs
前先加上一個""
, 代表什麼元素都沒有的狀態dp[i][j][k]
:strs[1:i]
中, 使用j
個0
和k
個1
最多所能組成的 string 個數2. 得到轉移方程:
假設
strs[i]
有zeros
個0
和ones
個1
, 則每個strs[i]
有兩種選擇(選 or 不選)若
zeros > j
或ones > k
, 則strs[i]
必不能選(超過個數上限)
➔dp[i][j][k] = dp[i - 1][j][k]
若
zeros ≤ m
或ones ≤ n
:
- 若
strs[i]
要選, 則dp[i][j][k] = dp[i - 1][j - zeros][k - ones] + 1
- 若
strs[i]
不選, 則dp[i][j][k] = dp[i - 1][j][k]
3. 初始化:
dp[0][0][0]
:當沒有元素時,0
個0
、0
個1
最多組成0
的 string- 其餘皆初始成
0
class Solution { |
- time:$O(len \cdot m \cdot n + L)$ ➔ for loop,
len
是strs
的長度,L
是所有 string 長度之和- $O(len \cdot m \cdot n)$:for loop
- $O(L)$:計算所有 string 的
0
、1
個數
- space:$O(len \cdot m \cdot n)$ ➔
dp
Solution 2:
想法:改進 Solution 1, 因為
dp[i][j][k]
只會用到上一列的狀態, 因此只需保存上一列的狀態即可, 根本不需開到 $O(len \cdot m \cdot n)$ space
class Solution { |
- time:$O(len \cdot m \cdot n + L)$ ➔
len
是strs
的長度,L
是所有 string 長度之和- $O(len \cdot m \cdot n)$:for loop
- $O(L)$:計算所有 string 的
0
、1
個數
- space:$O(m \cdot n)$ ➔
dp
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論