重点分析过程,和学概率论一样
1210.连号区间数
n个数,找长度为1、2、3...的连号区间的个数
- 模拟样例:
3 2 4 1
长度1的连号区间 4个 长度为2的连号区间有1个 d = 3有1个 d = 4有1个
总个数7
(时间复杂度)?这个需要再看看
- 算法思想:
最暴力做法:
//前两个for遍历所有可能区间
//将所得区间排序,再判断是不是连号区间。
优化:
1.优化区间 2.优化判断过程
对于2.的优化:
画绿的部分,找出连号区间的性质。
题中给出条件:排列。全排列定义:把n个不同的元素排成的一列,称为这n个元素的一个全排列,简称排列。==>那么没有重复的数字。
可以得到对于连号区间的一个性质:[a,b],Max-Min = b-a;
//每个序列得到最大的和最小的 判断是否符合性质
- 具体代码:
12 .递增三元组
给三个数组求满足条件的三元组 ai<bi<ci
- 算法思想:
暴力做法:
算法复杂度:O(n3)
优化:
数据范围:E5,那么应该用O(n)或O(nlogn)做法 =>最多枚举一个数组
前缀和、二分、排序忘完了
最多枚举一个数组,那么枚举A、B、C哪个数组?
如果选择A数组,B和C是有联系的,不独立的,下面无法用乘法原理去做。选择B,A与C是独立的。
接着对于B[i],找A数组比它小的数的个数,C数组中比它大的数个数。使用乘法原理将两数相乘。
对于找数组中比一个某个数大的数字的个数,可以用方法一:前缀和。(数的范围小于e5)(从1开始,范围从0开始,所以在输入的时候每个数字+1)方法二:先排序后二分。
前缀和方法:
把A中出现的数的个数统计一下,再搞个前缀和,这样每个数前面有多少数字就一目了然了。S[8] = 3,就代表A数组中比9小的数字有三个。
C的就往后搞。
代码实现:
1245.特别的数字
1
连续票据,一处错误导致一重一断
输入:N行,每行有几个输入用空格隔开