算法
文章平均质量分 95
约定写代码
虽然8年前开始学习更好,但今天开始学习,总要好过明天再开始。
展开
-
总和最大区间问题
题目和解题思路来源于吴军著作《计算之魂》。本题目是例题1.3。文章目录1 问题描述2 解题思路2.1 三重循环2.2 两重循环2.3 分治法1 问题描述总和最大区间问题:给定一个实数序列,设计一个最有效的算法,找到一个总和最大的区间。例如给定序列:1.5,-12.3,3.2,-5.5,23.2,3.2,-1.4,-12.2,34.2,5.4,-7.8,1.1,-4.9总和最大的区间是从第5个数(23.2)到第10个数(5.4)。2 解题思路2.1 三重循环public int[] findM原创 2022-01-03 07:45:02 · 5713 阅读 · 4 评论 -
数据结构与算法总结(完结)
极客时间算法学习之后开始跟着花花酱刷题。大概从4月份开始的。从今天开始(2020-8-24)开始做总结,复习一下已经刷过的题目。到目前为止leetcode刷题323道。1刷题原则根据花花酱建议,梳理出以下结论。要刷多少题1 每个类型 10-20,总共200-300题如何刷题1 同类型题目一起刷2 看代码很重要,看至少3-5种不同实现3 第一遍:5分钟想不出来就看答案;第二遍:尝试不看答案完整实现,一道题目不超过60min;第三遍:尝试快速实现,15-20min实现不了就看答案4 完整的手写原创 2020-08-24 09:13:12 · 1301 阅读 · 1 评论 -
Bellman-Ford算法
贝尔曼-福特算法是计算从源点到任意一点的最短路径的长度。初始化数组dist[0]为0,dist[i]为无穷大。以下操作循环执行至多n-1次,n为顶点数:对于每一条边 edge(Start,End),如果dist[Start] +Weight(Start, End)<dist[End],则令dist[End] =dist[Start]+Weight(Start, End)。若上述操作没有...转载 2019-03-17 22:18:55 · 317 阅读 · 0 评论 -
Depth-first Search深度优先搜索专题4
576. Out of Boundary Paths思路:这道题目难倒了我。最直接的思路是暴力搜索。要注意的问题1是需要仔细观察Example2,轨迹不同意思是可以从A点到B点,再从B点到A点也可以,只要step够用。所以暴力搜索,在(i,j)点在步骤允许范围内肆意地向4个方向扩散。退出条件是if (i == -1 || j == -1 || i == m || j == n),计数退出。这样...原创 2018-05-22 11:43:43 · 379 阅读 · 0 评论 -
欧几里得算法以及推论
欧几里得算法euclids algorithm欧几里得算法又称辗转相除法,用于计算两个正整数a、b的最大公约数(greatest common divisor)。计算公式gcd(a,b) = gcd(b, a%b)。用于RSA加密。 证明过程:参见欧几里得算法扩展给定两个正整数a、b,在计算a、b最大公约数d的同时,也能计算出两个整数x,y使得ax+by=d,x,y不一定同时是正整数...原创 2018-02-21 18:30:31 · 616 阅读 · 0 评论 -
数学归纳法证明Nicomachus's Theorem
今天看了《计算机程序设计艺术卷1》的部分内容。也希望更深入了解一下数学归纳法。所以将网页基本算重新写了一遍,写下证明过程。理论Theorem13=113=11^3=1 23=3+523=3+52^3=3+5 33=7+9+1133=7+9+113^3=7+9+11 43=13+15+17+1943=13+15+17+194^3=13+15+17+19 … 总的来说: ∀n∈...原创 2018-02-21 16:49:53 · 1109 阅读 · 0 评论 -
排序
基于比较的排序。排序根据数据量的不同分内存排序和外部排序。但数据量大得不能放在内存的时候就需要用外部排序。内存排序有:插入排序、希尔排序、堆排序、归并排序、快速排序。插入排序插入排序由N-1趟排序组成。对于p=1到(N-1)趟。在第p趟排序的时候,保证从0到p的元素已经是排序好的。将位置p上的元素element与 [0,p-1]上的元素比较,比element大的元素右移,找到合适的位置插入eleme转载 2017-01-15 09:56:04 · 385 阅读 · 0 评论 -
随机
随机数发生器线性同余 x(i+1)=AximodMx_(i+1)=Ax_i mod M x0x_0需要指定,称为种子。如果M=11,A=7,x0=1x_0=1,那么所生成的数为7,5,2,3,10,4,6,9,8,1,7,5,2… 这个序列的周期为M-1。如果M=231−1M=2^{31}-1,这个周期应该对大多数应用来说应该够了。转载 2017-03-05 16:32:56 · 223 阅读 · 0 评论 -
数据结构与算法分析
本系列的笔记基于七月算法的《求职面试》课程以及《数据结构域算法分析-java语言描述》第2版,做学习笔记。以下是这系列的目录。每个专题只做笔记,不求每个专题都要深入到很深很深。算法分析表栈队列并查集哈希表树堆图论递归深度优先二分贪心动态规划数论原创 2016-12-25 13:40:02 · 611 阅读 · 0 评论 -
数论
数论也是算法中的一个部分。转载 2017-03-08 19:38:07 · 258 阅读 · 0 评论 -
树
概念树的递归定义 根 父亲 树叶 兄弟 路径:从节点n1到ni的路径定义为节点n1,n2,…ni的一个序列。这条路径的长,为该路径的边,即i-1。 深度:对节点ni的深度为从根节点到ni的路径长。 高度:对节点ni的高度为从节点ni到叶子节点最长的路径长。 一棵树的高度=一棵树的深度实现class TreeNode{ T element; TreeNode fir原创 2017-01-02 11:29:51 · 1386 阅读 · 0 评论 -
散列
概念散列是一种用于以常数平均时间,执行插入、删除、查找的技术。 散列中要查找的数据项叫做关键字(key)。 映射:如果表的大小是tableSize,将每个关键词与0-tableSize-1的下标一一对应起来的过程叫做映射。 图中 dave—>0 john->3 phil->4 这种关系称为映射。 散列函数:f(关键词)=下标,这样的f 叫做散列函数。 如果两个关键词映射到同一个下标,这原创 2017-01-06 20:21:07 · 846 阅读 · 0 评论 -
栈
定义栈是一种只能在顶端插入和删除的列表。顶端是指最后一个操作的元素,数组中指下标最大的元素,链表中指末尾的元素。所以栈是一种LIFO(后进先出)的数据结构。实现栈可以使用数组、链表两种方式实现。自己动手coding,可以学习怎么处理异常,还有一些其他细节。上一篇中分析到如果在表的末端插入和删除都是O(1)的时间复杂度。 栈的基本操作有:E push(E item);E pop();E peek原创 2016-12-29 06:34:45 · 326 阅读 · 0 评论 -
表
第二次博客,希望能有第三次。这次主要聊聊表、列表、List(同一种事物)。抽象数据类型 ADT抽象数据类型(abstract data type,ADT),是带有一组操作的一些对象的集合。说人话:好几个相同类型的对象凑在一起,可以对这些对象进行一些操作,这样形成的数据结构就是抽象数据类型。一堆的Integer在一起,无论是按列表排开,还是键值对形式存储形成一个集合,在这个集合上可以进行一些添加、删除原创 2016-12-26 23:50:56 · 365 阅读 · 0 评论 -
图论
定义图由定点(vertex)的集V和边(edge)的集E组成。 每一条边就是一幅点对(v,w)。 如果点对是有序的,则图是有向的,又称为有向图。 图中的一条路径是一个顶点序列:w1,w2,w3…wN是的(wi,wi+1)属于E。 如果有一个顶点v到它自身的的边(v,v),那么(v,v)也被称为环。 如果一个无向图中从每个顶点到其他每个顶点都存在一条路径,则称无向图是连通的,又称为强连通的。转载 2017-01-21 18:22:07 · 3418 阅读 · 0 评论 -
并查集
定义并查集也是不相交集,存放数据的集合关系,如{1,2} {3,4,6} {5}。输入数据最初是N个集合,每个集合含有一个元素。初始的描述是所有的关系均为false。每个集合含有一个元素,这使得这些集合不相交。 ADT: 建立新集合 查找某个元素属于哪个集合 合并两个集合 时间复杂度O(1)集合S上的关系如果对于每一对元素(a,b),a,b∈Sa ,b\in S,aRb或者为true转载 2017-02-09 07:17:14 · 308 阅读 · 0 评论 -
优先队列----堆
问题打印机打印作业一般是放在队列中的。如果按照先来先打印的顺序,有一个100页的打印任务,那么会让后面短小的任务等待很长时间。更合理的做法也许是最后处理最耗时的打印任务,不管它是不是最后提交上来的。 在多用户操作系统中,操作系统让哪个程序使用CPU,是需要决定从队列里面选择的。一般做法是从队头获得程序,分配一定时间的时间片。如果执行完,从队列删除;如果没有执行完,插入队尾。这样处理的缺点是:一些很原创 2017-01-10 07:28:49 · 494 阅读 · 0 评论 -
算法分析
数学基础指数XA+XB=X(A+B)X^A+X^B=X^(A+B)算法分析原创 2016-12-25 14:15:20 · 494 阅读 · 0 评论 -
队列
定义队列是一种插入在队尾,删除在队头的一种表。用数组实现,下标大的是队尾,下标小的是对头。用链表实现,一个箭头从上一个节点指向下一个节点,没有前向指向(前驱)的是队头,没有后向指向(后继)的是队尾。 队列的基本操作(ADT) enqueue(T element); T dequeue();实现队列原创 2017-01-02 09:33:12 · 273 阅读 · 0 评论