LeetCode Brush Questions: Greedy Algorithm [455. 쿠키 배포] - 자바 버전

그리디 알고리즘: 할당 문제

자신만의 브러싱 과정을 기록하고, 답을 위해 다양한 솔루션을 참고하세요.

누락된 부분 수정해주시면 감사하겠습니다!

455. 쿠키 배포(쉬움)

한 무리의 아이들과 한 무리의 쿠키가 있고, 각 아이들은 배고픔 수준이 있고, 각 쿠키에는 크기가 있습니다. 각 어린이는 기껏해야 하나의 비스킷만 먹을 수 있으며 비스킷의 크기가 어린이의 배고픔 수준보다 클 때만 어린이가 배부르게 될 수 있습니다. 먹일 수 있는 최대 어린이 수를 구하십시오.

가. 쿠키를 나눠줄 욕심

  • 가장 작은 비스킷으로 가장 작은 아이들을 만나십시오 .

  • 작은 욕구를 가진 사람들은 가장 작은 비스킷으로 만족할 수 있고 큰 욕구를 가진 사람들은 더 큰 비스킷으로 만족할 수 있다는 사실에 지역적 최적화가 반영됩니다. "큰 비스킷, 낮은 수요" 의 낭비 현상을 피하십시오 .

  • 전역 최적은 각 사람에게 할당된 비스킷의 수가 최대화된다는 사실, 즉 가능한 한 많은 어린이에게 먹이를 준다는 사실에 반영됩니다.

나. 구체적인 시행

  • "작은 비스킷, 낮은 수요"를 달성하려면 수요와 비스킷 크기 간의 관계를 파악해야 합니다.

  • 편리한 방법은 어린이와 쿠키를 따로 분류하는 . 이런 식으로 우리는 가장 작은 수요와 가장 작은 비스킷을 가진 아이부터 시작하여 몇 쌍이 조건을 만족시킬 수 있는지 계산할 수 있습니다.

  • 작은 것에서 큰 것으로 순회하는 것의 장점은 앞에 있는 아이 A의 욕구를 충족시키지 못하는 비스킷은 반드시 뒤에 만족할 수 있는 쿠키만 아이 A가 필요로 하는 마지막 계속 판단하기 시작합니다.

c. 생각하다

  • 루프를 판단하기 위해 while()을 사용하는 이점은 루프 재사용할 수 있다는 것입니다. A 변수는 순환을 위한 변수로 사용할 수도 있고 내부 계수 변수로 사용할 수도 있으며 상황에 따라 변수가 증가하는지 감소하는지 판단할 수 있습니다.

  • while()의 판단문에서 && 또는 ||의 사용은 매우 유연합니다 질문의 의미에 대해 더 생각하면 매우 영리한 알고리즘을 작성하는 경우가 많습니다.

  • 계수 변수를 따로 설정하고 단독으로 사용하는 대신 계수 변수를 루프 변수 및 배열 첨자 변수와 연결하십시오.

D. 코드 구현

// 优先考虑饼干,小饼干先喂饱小胃口
public int findContentChildren(int[] g, int[] s) {
    int child = 0, cookie = 0;
    Arrays.sort(g); //先将饼干和孩子所需大小都进行排序
    Arrays.sort(s);
    while (child < g.length && cookie < s.length) { //当其中一个遍历完就结束
        if (g[child] <= s[cookie]) { //当用当前饼干可以满足当前孩子的需求,可以满足的孩子数量+1
            ++child;
        }
        ++cookie; // 饼干只可以用一次,因为饼干如果小的话,就是无法满足被抛弃,满足的话就是被用了
    }
    return child;
}

Guess you like

Origin blog.csdn.net/weixin_51909882/article/details/122115757