![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
fhxyryxc
这个作者很懒,什么都没留下…
展开
-
BFPTR算法
BFPTR算法,又称为中位数的中位数算法,它的最坏时间复杂度为O(n)TOP-K问题将n个数排序(比如快速排序或归并排序),选取排序后的第k个数,时间复杂度为O(nlogn)。维护一个k个元素的最大堆,存储当前遇到的最小的k个数,时间复杂度为O(nlogk)。部分的选择排序,即把最小的放在第1位,第二小的放在第2位,直到第k位为止,时间复杂度为O(kn)部分的快速排序(快速选择算法),每次划分之后判断第k个数在左右哪个部分,然后递归对应的部分,平均时间复杂度为O(n)。但最坏情况下复杂度为O(n转载 2021-01-27 17:25:49 · 468 阅读 · 1 评论 -
摩尔投票法
力扣169力扣229摩尔投票法 / Boyer-Moore投票算法设置一个候选人和一个计数器count。遍历数组,每次遇到和候选人一样的值则count + 1,否则count - 1当count == 0 时替换候选人。最后剩下的就是我们所求的众数。 public int majorityElement(int[] nums) { int n = nums.length; int candicate = 0; int count = 0; for(int i=0;i<n原创 2021-01-22 16:18:37 · 94 阅读 · 1 评论 -
拓扑排序
力扣207力扣210力扣1203求出一种拓扑排序方法的最优时间复杂度为 O(n+m),其中 n 和 m 分别是有向图 G 的节点数和边数图的几种表示方法List<List<Integer>> edges;//边int[] visited;//0-未搜索,1-搜索中,2-已完成搜索boolean valid = true;int[] indeg;//入度207:DFS public boolean canFinish(int numCourses, int[][]原创 2021-01-13 10:48:35 · 72 阅读 · 0 评论 -
Fisher-Yates 洗牌算法
力扣384原创 2021-01-06 18:01:21 · 126 阅读 · 0 评论 -
并查集
力扣547并查集主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作:合并(Union):把两个不相交的集合合并为一个集合。查询(Find):查询两个元素是否在同一个集合中。亲戚问题题目背景若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。题目描述规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。输入格式第一行转载 2021-01-05 16:53:52 · 48 阅读 · 0 评论 -
蓄水池采样算法
蓄水池采样算法算法假设数据序列的规模为 n,需要采样的数量的为 k。首先构建一个可容纳 k 个元素的数组,将序列的前 k 个元素放入数组中。然后从第 k+1 个元素开始,以 k/n 的概率来决定该元素是否被替换到数组中(数组中的元素被替换的概率是相同的)。 当遍历完所有元素之后,数组中剩下的元素即为所需采取的样本。题目从一个字符流中进行采样,最后保留 10 个字符,而并不知道这个流什么时候结束,且须保证每个字符被采样到的几率相同。力扣398力扣497...转载 2021-01-05 11:50:23 · 75 阅读 · 0 评论 -
和为N的连续正整数序列
自然数从1到n之间,有多少个数字含有1 //定义h(n)=从1到9999.....9999 ( n 个 9)之间含有1的数字的个数 private int H(int n) { //h(1)=f(1)=1 //h(2)=f(1)+f(2) //h(3)=f(1)+f(2)+f(3) //h(4)=f(1)+f(2)+f(3)+f(4) if(n==1)return 1; int rs=0;原创 2020-12-31 11:22:55 · 223 阅读 · 0 评论 -
PriorityQueue优先级队列
力扣:1046题优先级队列中,数据按关键词有序排列,插入新数据的时候,会自动插入到合适的位置保证队列有序。默认顺序是升序。顺序有两种形式:升序或者是降序。PriorityQueue是基于优先堆的一个无界队列,这个优先队列中的元素可以默认自然排序或者通过提供的Comparator(比较器)在队列实例化的时排序。要求使用Java Comparable和Comparator接口给对象排序,并且在排序时会按照优先级处理其中的元素。...原创 2020-12-30 14:34:14 · 59 阅读 · 0 评论 -
异或位运算
力扣476 public int findComplement1(int num) { int maxBitNum = 0; int tmpNum = num; while (tmpNum > 0) { maxBitNum += 1; tmpNum >>= 1; } return num ^ ((1 << maxBitNum) - 1); }原创 2020-12-24 11:32:42 · 81 阅读 · 0 评论 -
单调栈
力扣496 public int[] nextGreaterElement1(int[] nums1, int[] nums2) { if(nums2.length==0 || nums1.length==0) { return new int[] {}; } Map<Integer, Integer> map = new HashMap<Integer, Integer>(); Stack<Integer> stack = new Stack&l原创 2020-12-24 11:29:10 · 52 阅读 · 0 评论 -
排序算法
public void swap(int[] nums,int i,int j) { int m = nums[i]; nums[i] = nums[j]; nums[j] = m; }冒泡排序一次比较两个元素,大的元素渐渐沉到数组尾部 public void bubbleSort(int[] nums) { for(int i=0;i<nums.length-1;i++) { for(int j=0;j<nums.length-i-1;j++) { i.转载 2020-06-17 18:05:58 · 86 阅读 · 0 评论 -
最小生成树:Prime算法
Prim算法(加点法)普里姆算法在找最小生成树时,将顶点分为两类,一类是在查找的过程中已经包含在树中的(假设为 A 类),剩下的是另一类(假设为 B 类)。对于给定的连通网,起始状态全部顶点都归为 B 类。在找最小生成树时,选定任意一个顶点作为起始点,并将之从 B 类移至 A 类;然后找出 B 类中到 A 类中的顶点之间权值最小的顶点,将之从 B 类移至 A 类,如此重复,直到 B 类中没有顶点为止。所走过的顶点和边就是该连通图的最小生成树。package com.yue.algorithm.p转载 2020-06-08 18:16:42 · 302 阅读 · 0 评论 -
最小生成树:Kruskal算法
最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。Kruskal算法(加边法)初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里对给定连通图所有边权值进行排序对新加入边,进行是否形成回路判断(并查算法)package com.yue.algorithm.pa01;import java.util.ArrayList;public class Kruskal { class edge { int startVerte转载 2020-06-08 17:46:16 · 205 阅读 · 0 评论