![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构&算法
文章平均质量分 70
喜欢吃肉的饭
自由 自信 不失望
展开
-
(转)常见加密算法
原文:https://blog.csdn.net/baidu_22254181/article/details/82594072数字签名、信息加密 是前后端开发都经常需要使用到的技术,应用场景包括了用户登入、交易、信息通讯、oauth 等等,不同的应用场景也会需要使用到不同的签名加密算法,或者需要搭配不一样的 签名加密算法 来达到业务目标。这里简单的给大家介绍几种常见的签名加密算法和一些典型场景...转载 2019-04-16 19:30:16 · 151 阅读 · 0 评论 -
安排最多会议
一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲。给你每一个项目开始的时间和结束的时间(给你一个数组,里面 是一个个具体的项目),你来安排宣讲的日程,要求会议室进行 的宣讲的场次最多。返回这个最多的宣讲场次。public class BestArrange { public static class Program { public int start; public...原创 2019-04-30 17:28:14 · 317 阅读 · 0 评论 -
牛的数量+字符串全排列
母牛每年生一只母牛,新出生的母牛成长三年后也能每年生一只母牛,假设不会死。求N年后,母牛的数量。public static int cowNumber1(int n) { if (n < 1) { return 0; } if (n == 1 || n == 2 || n == 3) { return n; } //去年的牛(牛不死)+ 三年前出生现在可以生的牛 re...原创 2019-05-01 13:53:21 · 243 阅读 · 0 评论 -
数组中和为一个值
给你一个数组arr和一个整数aim。如果可以任意选择arr中的数字,能不能累加得到aim,返回true或者false。 public static boolean money1(int[] arr, int aim) { return process1(arr, 0, 0, aim); } public static boolean process1(...原创 2019-05-01 16:05:24 · 205 阅读 · 0 评论 -
左上到右下最小路径和
给你一个二维数组,二维数组中的每个数都是正数要求从左上角走到右下角,每一步只能向右或者向下。沿途经过的数字要累加起来。返回最小的路径和。public static int minPath1(int[][] matrix) { return process1(matrix, matrix.length - 1, matrix[0].length - 1); } //递归解法 pub...原创 2019-05-01 14:04:59 · 669 阅读 · 0 评论 -
manacher算法(Java实现)
public class Manacher { public static char[] manacherString(String str) { char[] charArr = str.toCharArray(); char[] res = new char[str.length() * 2 + 1]; int index = 0; for (int i = 0; i != ...原创 2019-05-03 21:42:48 · 770 阅读 · 0 评论 -
排序-冒泡排序
冒泡排序(Bubble Sort)冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。算法描述比较相邻的元素。如果第一个比第二个大,就交换它们两个;对每一对相邻元素作同样的工作,从开始第一对...原创 2019-05-11 17:20:18 · 119 阅读 · 0 评论 -
排序-插入排序
插入排序(Insertion Sort)插入排序的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。算法描述一般来说,插入排序都采用in-pl...原创 2019-05-11 17:21:04 · 98 阅读 · 0 评论 -
排序-选择排序
选择排序(Selection Sort)表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,所以用到它的时候,数据规模越小越好。好处是不占用额外的内存空间。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。算法描述n个记录的直接选择...原创 2019-05-11 17:21:38 · 128 阅读 · 0 评论 -
排序-堆排序
堆排序(Heap Sort)指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。算法描述将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2...原创 2019-05-11 17:22:09 · 104 阅读 · 0 评论 -
排序-快速排序
快速排序(Quick Sort)基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。算法描述快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:从数列中挑出一个元素,称为 “基准”(pivot);重新排序数列,所有元素比基准值小的摆放在基准前面,...原创 2019-05-11 17:22:45 · 151 阅读 · 0 评论 -
排序-归并排序
归并排序(Merge Sort)和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有...原创 2019-05-11 17:23:50 · 171 阅读 · 0 评论 -
排序-桶排序
桶排序(Bucket Sort)桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排算法描述人为设置一个BucketSize,作为每个桶所能放置多少个不同数值(例如当Bucket...原创 2019-05-11 17:24:50 · 397 阅读 · 0 评论 -
收益最多IPO
输入:参数1,正数数组 costs参数2,正数数组profits参数3,正数k参数4,正数mcosts[i]表示i号项目的花费profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润) k表示你不能并行、只能串行的最多做k个项目m表示你初始的资金说明:你每做完一个项目,马上获得的收益,可以支持你去做下一个 项目。输出: 你最后获得的最大钱数。public class ...原创 2019-04-30 16:52:22 · 153 阅读 · 0 评论 -
Hash算法小记
Hash,把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。哈希表是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映射到一个有限的地址区间上,并以关键字在地址区间...原创 2019-04-16 20:06:08 · 380 阅读 · 0 评论 -
字典序最小序列
给定一个字符串序列,拼接之后字典序最小。解法:自定义比较器,调用Arrays.sort()来排序之后拼接返回 public class LowestLexicography { public static class MyComparator implements Comparator<String> { //贪心考虑a+b是否大于b+a @Override pu...原创 2019-04-30 15:27:26 · 5632 阅读 · 0 评论 -
二叉查找树
查找树是一种数据结构,支持多种动态集合操作,既可以用作字典也可以用作优先队列。在二叉树上执行的基本操作的时间与树成正比。对于一个含有n个结点的完全二叉树,这些操作的最坏运行时间是O(lgn).一颗随机构造的二叉查找树的期望高度为O(lgn),从而这种树上的基本动态操作的平均时间为O(lgn)二叉查找树是按二叉树结构来组织的,这种树可以用链表结构表示,每一个节点都是一个对象。二叉查找树的关...原创 2019-04-17 16:15:01 · 101 阅读 · 0 评论 -
红黑树删除
将红黑树内的某一个节点删除。需要执行的操作依次是:首先,将红黑树当作一颗二叉查找树,将该节点从二叉查找树中删除;然后,通过"旋转和重新着色"等一系列来修正该树,使之重新成为一棵红黑树。详细描述如下:第一步:将红黑树当作一颗二叉查找树,将节点删除。这和"删除常规二叉查找树中删除节点的方法是一样的"。分3种情况:① 被删除节点没有儿子,即为叶节点。那么,直接将该节点删除就OK了。② 被删...原创 2019-04-17 14:56:24 · 250 阅读 · 0 评论 -
分治策略&插入排序
分治策略:将原问题划分为n个规模较小而结构与原问题相似的子问题;递归的解决这些子问题,然后再合并这些结果,得到原问题的解。分治模式在每一层递归上都有三个步骤:分解:将原问题分解为一系列子问题解决:递归的解决个子问题,若子问题足够小,则直接求解合并:将子问题的结果合并成原问题的解合并排序:分解:将n个元素分成等两份解决:用合并排序法对两个子序列递归的排序合并两个已排序的子序列以得到排...原创 2019-04-17 14:54:16 · 602 阅读 · 0 评论 -
递归式(第四章)
主定理:设a>=1和b>1位常数,设f(n)为一个函数,T(n)由递归式 T(n)=aT(n/b)+f(n) 对非负整数定义,其中n/b指n/b向下或者向上取整。那么T(n)可能有如下的渐进界:若对于某常数 ε>0,有f(n)=O(n^logb(a-ε)) 则T(n)=Θ(n^logba);若f(n)=Θ(nlogba),则T(n)=Θ((nlogba)*l...原创 2019-04-17 14:54:26 · 225 阅读 · 0 评论 -
红黑树性质
红黑树(red-black tree)是许多“平衡的”查找树中一种,它能保证在最坏情况下,基本的动态集合操作的时间为O(lgn)。红黑树是一种二叉查找树,但在每个节点上增加一个存储位表示节点的颜色,可以是red或black,通过对任何一条从根到叶子节点路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而近乎平衡的。树中每个节点包含五个域:color,key,left,...原创 2019-04-17 14:54:35 · 2502 阅读 · 0 评论 -
红黑树旋转
当在含有n个关键字的红黑树上运行时,查找树操作插入和删除的时间为O(lgn)。插入和删除操作对树做了修改可能破坏红黑树的性质,因此需要改变树中某些节点的颜色以及指针结构。指针结构的修改是通过旋转完成的,这是一种能够保持二叉树性质的查找树局部操作。左旋和右旋:左旋对x进行左旋,意味着"将x变成一个左节点"。左旋的伪代码《算法导论》:参考上面的示意图和下面的伪代码,理解“红黑树T的节...原创 2019-04-17 14:55:05 · 1028 阅读 · 0 评论 -
红黑树插入
将一个节点插入到红黑树中,需要执行哪些步骤呢?首先,将红黑树当作一颗二叉查找树,将节点插入;然后,将节点着色为红色;最后,通过旋转和重新着色等方法来修正该树,使之重新成为一颗红黑树。详细描述如下:第一步: 将红黑树当作一颗二叉查找树,将节点插入。红黑树本身就是一颗二叉查找树,将节点插入后,该树仍然是一颗二叉查找树。也就意味着,树的键值仍然是有序的。此外,无论是左旋还是右旋,若旋转之...原创 2019-04-17 14:55:45 · 182 阅读 · 0 评论 -
基本数据结构(栈,队列,树)
栈和队列都是动态集合,在这种结构中,可以用delete操作去掉元素是预先规定好的。栈中:可以去掉的是最近插入的元素(先进后出)队列中:可以去掉的是在集合中存在时间最长的那个(先进先出)栈:可是使用一个数组S[1…n]来实现一个至多有n个元素的栈。数组S有属性top[S],指向最近插入的元素。S[1]是栈底元素,S[top]是栈顶元素。top[S]=0时,栈空,若有弹出操作,则下溢。若top...原创 2019-04-17 16:15:21 · 282 阅读 · 0 评论 -
线性时间排序
8.1排序算法的时间下限比较排序可以抽象为决策树,一颗决策树是一颗满二叉树,表示某排序算法作用于给定输入所做的所有比较,而控制结构、数据移动等都被忽略了。要使排序算法能正确的工作,其必要条件是,n个元素的n!种排列中的每一种都作为决策树的一个叶子而出现。最坏情况下界从根到任意一个可达的叶节点之间最长路径长度,表示对应的排序算法最坏情况下的比较次数。定理:任意一个比较排序算法在最坏情况下...原创 2019-04-17 16:15:09 · 182 阅读 · 0 评论 -
折半查找
折半查找:也称二分查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组已经为空,则表示找不到指定的元素。这种搜索算法每一次比较都使搜索范围缩小一半,其时间复杂度是O(logN)。...原创 2019-04-18 13:14:36 · 247 阅读 · 0 评论 -
冒泡排序(带比较器)
冒泡排序几乎是个程序员都写得出来,但是如何写一个逼格高的冒泡排序却不是每个人都能做到,下面提供一个参考代码:import java.util.Comparator;//排序器接口(策略模式: 将算法封装到具有共同接口的独立的类中使得它们可以相互替换)public interface Sorter { /** * 排序 * @param list 待排序的数组 ...原创 2019-04-18 13:14:56 · 253 阅读 · 0 评论 -
java实现荷兰国旗问题&快速排序
给定一个数组arr和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N) public static int[] partition(int[] arr, int l, int r, int num) { int less = l - 1; int more = r + 1; ...原创 2019-04-19 17:08:02 · 346 阅读 · 0 评论 -
排序-基数排序
基数排序(Radix Sort)基数排序也是非比较的排序算法,对每一位进行排序,从最低位开始排序,复杂度为O(kn),为数组长度,k为数组中的数的最大的位数;基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序...原创 2019-05-11 17:25:36 · 507 阅读 · 0 评论