首页 > 其他分享 >(nice!!!)LeetCode 2928. 给小朋友们分糖果 I(枚举、容斥原理)

(nice!!!)LeetCode 2928. 给小朋友们分糖果 I(枚举、容斥原理)

时间:2024-06-01 19:30:44浏览次数:22  
标签:2928 int 容斥 三块 limit ans c2 LeetCode 个球

2928. 给小朋友们分糖果 I

在这里插入图片描述
思路:方法一,三层for循环直接暴力枚举,时间复杂度0(n^3)

class Solution {
public:
    int distributeCandies(int n, int limit) {
        int ans=0;
        for(int i=0;i<=n&&i<=limit;i++){
            for(int j=0;j<=n&&j<=limit;j++){
                for(int k=0;k<=n&&k<=limit;k++){
                    if(i+j+k==n) ans++;
                }
            }
        }
        return ans;
    }
};

思路:方法二,容斥原理。本题相当于是将连续的n个球分成三块,那就相当于在这段区间里插入两个木板进行分割,分割为A、B、C块。注意可以为0,也就是模板可以放在最前面和最后面。
1、先求出所有可能的方案数,也就是在n+2个位置里面选出2个位置,即组合数C(n+2,2)
2、再求出所有不可能的方案数,这里需要用到容斥原理
(1)先求出一个位置超过limit的情况,也就是将limit+1先分出去,剩下的n-limit-1个球进行组合C(n-limit-1+2,2)。这里有三块,也就是C(3,1)=3,即3*C(n-limit-1+2,2)。会发现这里面可能含有两块及以上不满足的情况。

(2)接着求出两个位置超过limit的情况,也就是将2 * -
(limit+1)先分出去,剩下的n-2 * (limit+1)个球进行组合C(n-2 * (limit+1)+2,2)。这里有三块,也就是C(3,2)=3,即3 * C(n-limit-1+2,2)。会发现这里面可能含有三块不满足的情况。
(3)最后求出三个位置超过limit的情况,也就是将3 * (limit+1)先分出去,剩下的n-3 * (limit+1)个球进行组合C(n-3 * (limit+1)+2,2)。这里有三块,也就是C(3,3)=1,即1 * C(n-limit-1+2,2)。

3、所有不可能的方案数=3 * C(n-limit-1+2,2)-3 * C(n-limit-1+2,2)+1 * C(n-limit-1+2,2)
4、最后的符合方案数就是=所有可能的方案数-所有不可能的方案数

注意:C(a,2),这里的a一定要>=2。

class Solution {
public:
    int c2(int u){
        return u>1? u*(u-1)/2:0;
    }
    int distributeCandies(int n, int limit) {
        return c2(n+2)-(3*c2(n-(limit+1)+2)-3*c2(n-2*(limit+1)+2)+c2(n-3*(limit+1)+2));
    }
};

标签:2928,int,容斥,三块,limit,ans,c2,LeetCode,个球
From: https://blog.csdn.net/weixin_46028214/article/details/139377898

相关文章

  • LeetCode 第15题:三数之和的解析
    大家好!本文我们将要探索的是LeetCode的第15题:三数之和。我们的目标是在一片数字的海洋中寻找三颗神奇的珍珠,它们的和为零。准备好了吗?让我们一同踏上这段充满挑战和乐趣的旅程吧!文章目录题目介绍解题思路思路1:暴力法思路2:双指针法思路3:哈希表法思路4:回溯法思......
  • Q2 LeetCode35 搜索插入位置
    //有序查找,无重复元素,要求时间复杂度O(logn)//如果有目标元素则返回位置//如果没有目标元素,最后一次right位置后面就是该插入的位置第一次提交错误认为最后一次mid位置是插入的位置,其实最后一次right位置才是正确的插入位置(升序数组)1classSol......
  • LeetCode 704 二分查找
    第一次提交错误:if-else语句中第二个if前未加else,导致循环出错//二分查找//有序情况下的查找方式,时间复杂度O(logn)//注意左右边界以及停止循环条件left<=right classSolution{publicintsearch(int[]nums,inttarget){......
  • LeetCode---哈希表
    242.有效的字母异位词给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。代码示例: //时间复杂度:O(n)//空间复杂度:O(1)classSolution{public:......
  • LeetCode 第14题:最长公共前缀题目解析(进阶版)
    本文我们来探索LeetCode第14题——最长公共前缀题目解析(进阶版)。文章目录引言题目介绍解题思路思路1:水平扫描法思路2:垂直扫描法思路3:分治法思路4:二分查找法思路5:字典树(Trie)水平扫描法详细解析步骤1:初始化前缀步骤2:逐个比较示例讲解Java代码实现图......
  • LeetCode 1305. All Elements in Two Binary Search Trees
    原题链接在这里:https://leetcode.com/problems/all-elements-in-two-binary-search-trees/description/题目:Giventwobinarysearchtrees root1 and root2,return alistcontainingalltheintegersfrombothtreessortedin ascending order.Example1:Input:......
  • LeetCode 2024/6 每日一题 合集
    2024/6/12928.给小朋友们分糖果I分析枚举所有可能的方案数即可代码实现classSolution{public:intdistributeCandies(intn,intlimit){intans=0;for(inta=0;a<=limit;++a){for(intb=0;b+a<=n&&b<=limi......
  • 【LeetCode算法】第101题:对称二叉树
    目录一、题目描述二、初次解答三、官方解法四、总结一、题目描述二、初次解答1.思路:递归判定左子树和右子树是否对称。用一个新函数sym来递归判定左子树和右子树是否对称。该函数细节:判定当前传入的两个根节点是否为空,若均为空则返回true,若只有其中一个为空则返回fa......
  • LeetCode-2890. 重塑数据:融合
    2890.重塑数据:融合DataFramereport+-------------+--------+|ColumnName|Type|+-------------+--------+|product|object||quarter_1|int||quarter_2|int||quarter_3|int||quarter_4|int|+-------------+--------+编写一个......
  • LeetCode-2891. 方法链
    2891.方法链DataFrameanimals+-------------+--------+|ColumnName|Type|+-------------+--------+|name|object||species|object||age|int||weight|int|+-------------+--------+编写一个解决方案来列出体重严格超过......