Рубрики
Без рубрики

Решение: те и нули

Это является частью серии пояснений решения LeetCode (индекс). Если вам понравилось это решение или Фу … помечены алгоритмами, JavaScript, Java, Python.

Это является частью серии объяснений решения 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”