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!
評論
