mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-07 07:35:35 +08:00
给 0474.一和零 添加了CPP的三维数组实现版本。
This commit is contained in:
@ -159,7 +159,89 @@ public:
|
||||
* 时间复杂度: O(kmn),k 为strs的长度
|
||||
* 空间复杂度: O(mn)
|
||||
|
||||
C++:
|
||||
使用三维数组的版本
|
||||
|
||||
```CPP
|
||||
class Solution {
|
||||
public:
|
||||
int findMaxForm(vector<string>& strs, int m, int n) {
|
||||
int num_of_str = strs.size();
|
||||
|
||||
vector<vector<vector<int>>> dp(num_of_str, vector<vector<int>>(m + 1,vector<int>(n + 1, 0)));
|
||||
|
||||
/* dp[i][j][k] represents, if choosing items among strs[0] to strs[i] to form a subset,
|
||||
what is the maximum size of this subset such that there are no more than m 0's and n 1's in this subset.
|
||||
Each entry of dp[i][j][k] is initialized with 0
|
||||
|
||||
transition formula:
|
||||
using x[i] to indicates the number of 0's in strs[i]
|
||||
using y[i] to indicates the number of 1's in strs[i]
|
||||
|
||||
dp[i][j][k] = max(dp[i-1][j][k], dp[i-1][j - x[i]][k - y[i]] + 1)
|
||||
|
||||
*/
|
||||
|
||||
|
||||
// num_of_zeros records the number of 0's for each str
|
||||
// num_of_ones records the number of 1's for each str
|
||||
// find the number of 0's and the number of 1's for each str in strs
|
||||
vector<int> num_of_zeros;
|
||||
vector<int> num_of_ones;
|
||||
for (auto& str : strs){
|
||||
int count_of_zero = 0;
|
||||
int count_of_one = 0;
|
||||
for (char &c : str){
|
||||
if(c == '0') count_of_zero ++;
|
||||
else count_of_one ++;
|
||||
}
|
||||
num_of_zeros.push_back(count_of_zero);
|
||||
num_of_ones.push_back(count_of_one);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// num_of_zeros[0] indicates the number of 0's for str[0]
|
||||
// num_of_ones[0] indiates the number of 1's for str[1]
|
||||
|
||||
// initialize the 1st plane of dp[i][j][k], i.e., dp[0][j][k]
|
||||
// if num_of_zeros[0] > m or num_of_ones[0] > n, no need to further initialize dp[0][j][k],
|
||||
// because they have been intialized to 0 previously
|
||||
if(num_of_zeros[0] <= m && num_of_ones[0] <= n){
|
||||
// for j < num_of_zeros[0] or k < num_of_ones[0], dp[0][j][k] = 0
|
||||
for(int j = num_of_zeros[0]; j <= m; j++){
|
||||
for(int k = num_of_ones[0]; k <= n; k++){
|
||||
dp[0][j][k] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* if j - num_of_zeros[i] >= 0 and k - num_of_ones[i] >= 0:
|
||||
dp[i][j][k] = max(dp[i-1][j][k], dp[i-1][j - num_of_zeros[i]][k - num_of_ones[i]] + 1)
|
||||
else:
|
||||
dp[i][j][k] = dp[i-1][j][k]
|
||||
*/
|
||||
|
||||
for (int i = 1; i < num_of_str; i++){
|
||||
int count_of_zeros = num_of_zeros[i];
|
||||
int count_of_ones = num_of_ones[i];
|
||||
for (int j = 0; j <= m; j++){
|
||||
for (int k = 0; k <= n; k++){
|
||||
if( j < count_of_zeros || k < count_of_ones){
|
||||
dp[i][j][k] = dp[i-1][j][k];
|
||||
}else{
|
||||
dp[i][j][k] = max(dp[i-1][j][k], dp[i-1][j - count_of_zeros][k - count_of_ones] + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return dp[num_of_str-1][m][n];
|
||||
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
## 总结
|
||||
|
||||
|
Reference in New Issue
Block a user