Раздать печеньки детям
Допустим, вы - многодетный родитель и хотите угостить всех своих детей печеньками. Вы должны дать хотя бы одну печеньку каждому ребенку. Каждый ребенок обладает своим фактором жадности 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)))
Комментарии
Отправить комментарий