Раздать печеньки детям

Допустим, вы - многодетный родитель и хотите угостить всех своих детей печеньками. Вы должны дать хотя бы одну печеньку каждому ребенку. Каждый ребенок обладает своим фактором жадности gi до печенек.  Фактор жадности - это минимальный размер печеньки, которой ребенок будет доволен. И у каждой печеньки есть свой размер sj. Если sj >= gi, мы можем дать печеньку j ребенку i, и тот будет доволен. Ваша задача максимизировать число довольных детей и в качестве ответа выдать число довольных детей.
Примечания:
Фактор жадности всегда положителен.
Каждый ребенок может взять только одну печеньку.
Пример 1:
Дано: [1,2,3], [1,1]

Результат: 1

Пояснение: у вас 3 детей и 2 печеньки. Факторы эадности детей соответственно  1, 2, 3. 
Даже если у вас 2 печеньки, их размер равен 1, поэтому доволен останется только ребенок с фактором жадности 1.
Пример 2:
Дано: [1,2], [1,2,3]

Результат: 2

Пояснение: У вас 2 детей (с фактором жадности 1 и 2) и 3 печеньки. 
У трёх печенек размера достаточно, чтобы удовлетворить обоих детей, поэтому ответ 2.
Идея решения:
Если отсортировать размеры печенек и жадность детей по возрастанию, то мы просто сравниваем самую маленькую печеньку с менее жадным ребенком (его фактором). Если печенька удовлетворяет запросы ребенка - у нас +1 довольный малыш. Если нет, то печенька, скорее всего, не удовлетворит никого больше (поскольку жадность будет только наростать).


Компилируемое решение

public int findContentChildren(int[] g, int[] s) {
    if (g==null || g.length==0) return 0; // sanity check
    if (s==null || s.length==0) return 0; // sanity check
    Arrays.sort(g); // sort
    Arrays.sort(s); // sort
    int j = 0;
    int count = 0;
    for (int i = 0; i < g.length; i++) { // iterate greedy factor
        while (j < s.length && g[i]>s[j]) { // skip useless cookies
            j++;
        }
        if (j<s.length) {
            count++; // cookie matches child greedy factor
            j++; // see next cookie
            if (j>=s.length) {
                return count;
            }
        } else {
            return count;
        }
    }
    return count;
}
Результат теста:
Runtime: 8 ms, faster than 98.24% of Java online submissions for Assign Cookies.
Memory Usage: 40.3 MB, less than 100.00% of Java online submissions for Assign Cookies.

Анализ сложности:
Сложность по времени: O(g*log(g)+s*log(s) + s + g) = O(max(g, s) * log (max(g, s)))

Комментарии

Популярные сообщения из этого блога

Разбиение числа на сумму с максимальным произведнием слагаемых

Число подмассивов, в которых сумма элементов равна k

Сложить два числа, которые представлены списком