Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашел его полезным, Пожалуйста, как этот пост и/или УПОТАТЬ Мое решение пост на форумах LeetCode Отказ
Проблема летета # 474 (средний): те и нули
Описание:
( Перейти к : Идея решения Код : JavaScript | Python |. Java |. C ++
Вам дают массив двоичных строк улс
и два целых числа м
и n
Отказ
Вернуть размер наибольшего подмножества улс
Такое, что есть больше всего м
0
С. и n
1
в подмножестве.
Набор х
это подмножество набора y
Если все элементы х
также элементы y
Отказ
Примеры:
Вход: | улс = [“10″,”0001″,”111001″,”1″,”0”],, |
Выход: | 4 |
Объяснение: | Самое большое подмножество с большинством 5 0 и 3 1 – {«10», «0001», «1», «0»}, поэтому ответ 4. Другие действительные, но меньшие подмножества включают {0001 “,” 1 “} и {” 10 “,” 1 “,” 0 “}. {«111001»} – неверное подмножество, потому что он содержит 4 1, превышает максимум 3. |
Вход: | улс = [“10″,”0″,”1”],, |
Выход: | 2 |
Объяснение: | Самое большое подмножество {“0”, “1”}, поэтому ответ 2. |
Ограничения:
1 длиной
1 [I]. Длина
улс [я]
состоит только из цифр'0'
и'1'
Отказ1, Н.
Идея:
( Перейти к : Описание проблемы Код : JavaScript | Python |. Java |. C ++
Эта проблема – это вариация на 0-1 Knapsack Проблема С морщиком: каждый элемент имеет двумерную массу, но постоянное значение. Если бы мы должны были наивно попытаться каждую перестановку до 600 Строки, это было бы 2 ^ 600 Перестановки.
Но, к счастью, мы не поручено отслеживать каждую перестановку, но просто максимальное количество предметов. Это призывает к использованию Динамическое программирование ( DP ) Чтобы уменьшить общую сложность вместо этого только отслеживать наилучшие результаты различных подпроблем, возникающих при работе на пути к этому событию.
Для нашего массива DP ( DP ), DP [I] [J] будет представлять наибольшее количество предметов, которые могут быть добавлены к доходности Я Zeros а также J тесно. Таким образом, наш ответ в конечном итоге будет dp [m] [n] Отказ Мы, естественно, будем делать снизу вверх по подходу DP, поскольку мы будем начать без данных и итерацию через входную массив ( S ), добавляя больше данных в дп Как мы идем.
С каждой строки в S потребует от нас итерации через полноту DP Ищете данные для обновления, нам понадобится выполнить эту итерацию в диапазоне сверху вниз, чтобы избежать вмешательства с нашим общим подходом снизу вверх, что было бы, если бы мы должны были обновить записи, которые будут основой для более поздних обновлений в тот же проход.
Как только мы достигнем конца, мы возвращаем dp [m] [n] Отказ
Реализация:
Поскольку каждая запись в ДП будет в диапазоне [0,200] на основе ограничений для М и N У нас есть возможность использовать 8-битный Номер хранения массива для целей.
У Python есть другие, более быстрые решения, но это один из самых простых и отражает решения на других языках.
Код JavaScript:
( Перейти к : Описание проблемы Идея решения
var findMaxForm = function(S, M, N) { let dp = Array.from({length:M+1},() => new Uint8Array(N+1)) for (let i = 0; i < S.length; i++) { let str = S[i], zeros = 0, ones = 0 for (let j = 0; j < str.length; j++) str.charAt(j) === "0" ? zeros++ : ones++ for (let j = M; j >= zeros; j--) for (let k = N; k >= ones; k--) dp[j][k] = Math.max(dp[j][k], dp[j-zeros][k-ones] + 1) } return dp[M][N] };
Код Python:
( Перейти к : Описание проблемы Идея решения
class Solution: def findMaxForm(self, S: List[str], M: int, N: int) -> int: dp = [[0 for _ in range(N+1)] for _ in range(M+1)] for str in S: zeros = str.count("0") ones = len(str) - zeros for i in range(M, zeros - 1, -1): for j in range(N, ones - 1, -1): dp[i][j] = max(dp[i][j], dp[i-zeros][j-ones] + 1) return dp[M][N]
Java код:
( Перейти к : Описание проблемы Идея решения
class Solution { public int findMaxForm(String[] S, int M, int N) { int[][] dp = new int[M+1][N+1]; for (String str : S) { int zeros = 0, ones = 0; for (char c : str.toCharArray()) if (c == '0') zeros++; else ones++; for (int i = M; i >= zeros; i--) for (int j = N; j >= ones; j--) dp[i][j] = Math.max(dp[i][j], dp[i-zeros][j-ones] + 1); } return dp[M][N]; } }
C ++ код:
( Перейти к : Описание проблемы Идея решения
class Solution { public: int findMaxForm(vector& S, int M, int N) { int dp[101][101]{0}; for (string str : S) { int zeros = 0, ones = 0; for (char c : str) c == '0' ? zeros++ : ones++; for (int i = M; i >= zeros; i--) for (int j = N; j >= ones; j--) dp[i][j] = max(dp[i][j], dp[i-zeros][j-ones] + 1); } return dp[M][N]; } };
Оригинал: “https://dev.to/seanpgallivan/solution-ones-and-zeroes-2emf”