leetcode刷题(三)——容斥原理
leetcode刷题系列三。这一节的内容主要是容斥原理的题目和题解。
百度百科上容斥原理的解释:
在计数时,必须注意没有重复,没有遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理
公式
两个集合的容斥关系公式:A∪B =|A∪B| = |A|+|B| - |A∩B |(∩:重合的部分)
三个集合的容斥关系公式:|A∪B∪C|= |A|+|B|+|C| - |A∩B| - |B∩C| - |C∩A| + |A∩B∩C|
例题
算法分析
//求最大公约数
#define ll long long
int gad(int a,int b)
{return b==0?a:gad(b,a%b);
}
//求最小公倍数
ll lcm(int a,int b)
{return a*b/gad(a,b);
}
int getabc(int n,int a,int b,int c)
{ll num1=lcm(a,b);ll num2=lcm(b,c);ll num3=lcm(a,c)ll ans=n/a+n/b+n/c-n/lcm(a,b)-n/lcm(a,c)-n/lcm(b,c)+n/lcm(num1,lcm(num2,num3));return ans;
}
题目一
题目链接
#define ll long long
ll gcd(int a,int b)
{return b==0? a:gcd(b,a % b);
}ll lcm(int a, int b)
{return a / gcd(a,b) * b;
}int MIN(ll a, ll b)
{return a < b? a: b;
}int nthUglyNumber(int n, int a, int b, int c)
{ll num1 = lcm(a,b);ll num2 = lcm(b,c);ll num3 = lcm(a,c);ll num0 = lcm(num1,lcm(num2,num3));int min = MIN(a,MIN(b,c));ll left = min;ll right = min * n;ll mid = 0;while(left < right){mid = (left + right) / 2;int sum = mid / a + mid / b + mid / c - mid /num1 - mid / num2 -mid / num3 + mid / num0;if(sum >= n)right = mid;else if(sum < n)left = mid + 1 ;}return right;
题目二
题目链接
思路:考虑 dp[i][j]。最后一首歌,我们可以播放没有播放过的歌也可以是播放过的。如果未播放过的,那么就是 dp[i-1][j-1] * (N-j) 种选择方法。如果不是,那么就是选择之前的一首歌,dp[i-1][j] * max(j-K, 0)(j 首歌,最近的 K 首不可以播放)。
class Solution {
public:int numMusicPlaylists(int n, int len, int dis) {int mod=1e9+7;long dp[101][101];memset(dp,0,sizeof(dp));dp[0][0]=1;//i为听过歌的数量//j为听了多少首歌//dis是歌曲间隔for(int i=1;i<=n;i++){for(int j=1;j<=len;j++){dp[i][j]+=dp[i][j-1]*max(0,(i-dis));dp[i][j]+=dp[i-1][j-1]*(n-(i-1));dp[i][j]%=mod;}}return dp[n][len];}
};
总结
写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于 java开发 的学习思路及方向。从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。
由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的 点击我的Gitee获取。
还有 高级java全套视频教程 java进阶架构师 视频+资料+代码+面试题!
全方面的java进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。
leetcode刷题(三)——容斥原理相关推荐
- LeetCode刷题笔记- 15.三数之和
LeetCode刷题笔记- 15.三数之和 C语言 题目 注意点 C语言 /*** Return an array of arrays of size *returnSize.* The sizes ...
- leetcode刷题之树(三)
翻转二叉树,感觉做二叉树的问题好像都是那一套公式,除了个别的问题解决不了,用上篇博客leetcode刷题之树(二)的模型基本可以解决.总体来说就是树基本都可以利用递归和迭代的方法去解决,在涉及到树的遍 ...
- LeetCode刷题记录7——824. Goat Latin(easy)
LeetCode刷题记录7--824. Goat Latin(easy) 目录 LeetCode刷题记录7--824. Goat Latin(easy) 题目 语言 思路 后记 题目 题目需要将一个输 ...
- LeetCode刷题记录5——441. Arranging Coins(easy)
LeetCode刷题记录5--441. Arranging Coins(easy) 目录 LeetCode刷题记录5--441. Arranging Coins(easy) 题目 语言 思路 后记 题 ...
- LeetCode刷题记录1——717. 1-bit and 2-bit Characters(easy)
LeetCode刷题记录1--717. 1-bit and 2-bit Characters(easy) LeetCode刷题记录1--717. 1-bit and 2-bit Characters( ...
- Leetcode刷题 463题:岛屿的周长(基于Java语言)
** Leetcode刷题 463题:岛屿的周长(基于Java语言) ** 一. 题目描述: 给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域. 网格中的格子水平和垂直方向相 ...
- c语言贪心算法合并箭,LeetCode刷题题库:贪心算法
LeetCode刷题笔记:贪心算法 自大学开始,我便陆陆续续的学习一些 算法和数据结构 方面的内容,同时也开始在一些平台刷题,也会参加一些大大小小的算法竞赛.但是平时刷题缺少目的性.系统性,最终导致算 ...
- LeetCode刷题之旅
LeetCode刷题之旅 一.链表 1.链表逆序(leetcode 206.Reverse Linked List)esay 题目描述:已知链表头节点指针head,将链表逆序. 思路:从链表的头节点依 ...
- C#LeetCode刷题-程序员面试金典
本文由 比特飞 原创发布,欢迎大家踊跃转载. 转载请注明本文地址:C#LeetCode刷题-程序员面试金典 | .Net中文网. C#LEETCODE刷题概述 概述 所有LeetCode程序员面试金典 ...
最新文章
- 手把手教你如何扩展GridView之自带CheckBox
- 为什么「反向传播」一定要在生物学上有对应?
- 10、Power Map—自定义地图背景
- 你觉得你个性上最大的优点是什么?
- 通过组策略批量安装Lync 2010客户端
- springboot logback自定义配置文件路径
- 删除变量PHP之session的使用
- python记录(5)- find() 与 rfind()
- java字符串数字统计_对字符串进行简单的字符数字统计 探索java中的List功能
- Discuz!客户端api开发(一)
- 转博答辩ppt_如何高质量的完成一个论文答辩ppt?
- vbs表白小程序,女生同意才能关掉。
- 玩转python(一)——微信远程控制电脑
- 决胜机房奥林匹克之LCA篇
- Python 计算KDJ指标
- 经典语录-每日积累-03
- WebRTC -- Windows平台编译
- 中级职称评审有什么要求呢?
- docker覆盖镜像默认命令之docker entrypoint
- Photoshop-填充和描边
热门文章
- 前后端分离跨域问题Access to XMLHttpRequest at ‘http://localhos...has been blocked by CORS policy: No ‘Access-
- 深入理解GlusterFS之数据均衡
- 计算hashCode通用计算公式
- shell综合练习(二)
- 一天一大 lee(计数二进制子串)难度:简单-Day20200810
- android support v13,java – 程序类型已存在:android.support.v13.v...
- Trie——51nod1526 分配笔名
- 今日新闻快讯摘要十条
- java代码自动回复_17.10.18 Java实现公众号关注自动回复图文
- 国内Linux笔记天花板,不接受反驳!