In the computer world, use restricted resource you have to generate maximum benefit is what we always want to pursue.
For now, suppose you are a dominator of m 0s
and n 1s
respectively. On the other hand, there is an array with strings consisting of only 0s
and 1s
.
Now your task is to find the maximum number of strings that you can form with given m 0s
and n 1s
. Each 0
and 1
can be used at most once.
Note:
- The given numbers of
0s
and1s
will both not exceed100
- The size of given string array won't exceed
600
.
Example 1:
Input: Array = {"10", "0001", "111001", "1", "0"}, m = 5, n = 3 Output: 4 Explanation: This are totally 4 strings can be formed by the using of 5 0s and 3 1s, which are “10,”0001”,”1”,”0”
Example 2:
Input: Array = {"10", "0", "1"}, m = 1, n = 1 Output: 2 Explanation: You could form "10", but then you'd have nothing left. Better form "0" and "1".
题目链接:https://leetcode.com/problems/ones-and-zeroes/
题目分析:01背包一眼题,只不过背包有两个维度的限制(0的个数和1的个数),原理相同
以下做法18ms,击败86%
class Solution {
public int findMaxForm(String[] strs, int m, int n) {
int[][] dp = new int[m + 1][n + 1];
int[] ones = new int[strs.length];
for (int i = 0; i < strs.length; i++) {
for (int j = 0; j < strs[i].length(); j++) {
if (strs[i].charAt(j) == '1') {
ones[i]++;
}
}
}
for (int i = 0; i < strs.length; i++) {
int zerosi = strs[i].length() - ones[i];
for (int j = m; j >= zerosi; j--) {
for (int k = n; k >= ones[i]; k--) {
if (dp[j][k] < dp[j - zerosi][k - ones[i]] + 1) {
dp[j][k] = dp[j - zerosi][k - ones[i]] + 1;
}
}
}
}
return dp[m][n];
}
}
其实不难发现,没有必要存ones数组,直接在dp最外层循环计算即可
10ms,击败100%
class Solution {
public int findMaxForm(String[] strs, int m, int n) {
int[][] dp = new int[m + 1][n + 1];
for (int i = 0; i < strs.length; i++) {
int onesi = 0;
for (int j = 0; j < strs[i].length(); j++) {
if (strs[i].charAt(j) == '1') {
onesi++;
}
}
int zerosi = strs[i].length() - onesi;
for (int j = m; j >= zerosi; j--) {
for (int k = n; k >= onesi; k--) {
if (dp[j][k] < dp[j - zerosi][k - onesi] + 1) {
dp[j][k] = dp[j - zerosi][k - onesi] + 1;
}
}
}
}
return dp[m][n];
}
}