思路: 一般我们会想到用排序,然后找出中间那个值,此值就是超过一半的那个数 但是这样的时间复杂度一般为O(nlogn) 其实有一个比较巧妙的办法,时间复杂度为O(n) 1,遍历这个数组,如果之前一个数字和下一个数字重复则+1,否则-1 这样最终留下的数就是那个超过一半的那个数 代码 void mor ...
分类:
编程语言 时间:
2020-11-04 18:37:41
阅读次数:
17
魔改一下nlogn求最长不下降子序列的模板就行 对于不能修改的位置 他们肯定是存在答案里面的 那么维护答案序列最后的不可修改位置 设为las 如果新加入的数的位置小于等于las 则跳过 否则 维护las 并且把las以后的序列清空 #include<bits/stdc++.h> using name ...
分类:
其他好文 时间:
2020-10-30 12:51:14
阅读次数:
20
A int main() { IOS; for (cin >> _; _; --_) { cin >> n; m = n; k = 0; while (m) ++k, m /= 10; cout << (n % 10 - 1) * 10 + (1 + k) * (k) / 2 << '\n'; } ...
分类:
其他好文 时间:
2020-10-22 22:26:45
阅读次数:
20
1.素数判断。 直接暴力判断,复杂度是根号级别。 2.筛选法。 普通筛法,对每个数,将其倍数全部标记。 复杂度是O(n/1+n/2+...+n/n),调和级数,O(nlogn)级别。 高级一点的筛法,我们发现,一个合数的倍数会被自己的因子提前标记,所以只需要对素数的倍数进行标记。 复杂度...我忘了 ...
分类:
其他好文 时间:
2020-10-10 16:55:29
阅读次数:
17
有时,我们要维护一个数据结构,支持区间对x取min。 如果只有区间max/min查询,则可以把区间的所有节点的值对x取min。 标记可以合并,这样子时间复杂度是nlogn的。 但是如果有了区间和查询,则不能这么做。 虽然标记可以合并,但是无法更新区间最大值。 考虑维护区间严格次大值m2和区间严格次大 ...
分类:
其他好文 时间:
2020-09-17 19:22:52
阅读次数:
27
十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 摘自https ...
分类:
编程语言 时间:
2020-09-17 19:03:08
阅读次数:
91
FFT 1 简述 FFT是专门用来求解多项式乘法的一个高效算法。 总所周知,朴素的多项式乘法的时间复杂度是$O(n^2)$,而FFT利用复数的知识做到了$O(nlogn)$。 2 点值表达式 设$A(x)$是一个n-1次方的多项式,那么把n个不同的x代入,一定可以得到n个y,这n对(x,y)唯一确定 ...
分类:
其他好文 时间:
2020-08-27 17:11:12
阅读次数:
57
问题: 如何从一个无序的数组中求出第K大的数。 思路一: 对数组排序,直接取第K个元素,O(nlogn) 思路二: 选择随机选择算法,O(n) ...
分类:
编程语言 时间:
2020-08-18 13:34:41
阅读次数:
63
隔了几个月,又开始写博客了qwq kruskal时间复杂度为O(nlogn)它的算法思路是这样的:我们根据边的权值将所有边排序,然后枚举每条边,用并查集去查询这条边的两个端点是否在同一集合内,若在同一集合内,则删掉这条边,若不在同一结合则加入这条边,并将这两个端点所在的集合合并。附一下代码: 123 ...
分类:
其他好文 时间:
2020-08-17 17:07:58
阅读次数:
90
八种排序算法可以按照如图分类,本文主要介绍快速排序。 交换排序 所谓交换,就是序列中任意两个元素进行比较,根据比较结果来交换各自在序列中的位置,以此达到排序的目的。 快速排序 快速排序的思想很简单,就是先把待排序的数组拆成左右两个区间,左边都比中间的基准数小,右边都比基准数大。接着左右两边各自再做同 ...
分类:
编程语言 时间:
2020-07-29 15:15:23
阅读次数:
74