![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Algo
算法学习
Top_xiao
这个作者很懒,什么都没留下…
展开
-
专栏目录
AlgoREADME00-前置知识复杂度分析Java快速入门01-基础算法递推&&递归二分分治模拟排序前缀和&&差分贪心02-数据结构03-简单数学04-字符串05-图论06-树上问题07-其他技巧08-脑洞问题...原创 2020-11-25 15:02:05 · 113 阅读 · 0 评论 -
位运算
位运算计算机底层都是用二进制来表示的。每个数都可以表示成二进制的形式,位运算就是基于整数的二进制表示形式来进行的运算,所以运算起来还是很快的。常用的运算符有6种,分别是 与&、或|、异或^、取反~、左移<<、右移>>。基础操作运算符描述解释&与二进制对应位上都是1才是1|或二进制对应位上有1就是1^异或二进制对应位上不同才是1~取反0 变 1, 1 变 0<<左移各二进位全部左移若干原创 2020-12-14 11:27:50 · 256 阅读 · 0 评论 -
堆
堆堆是一棵树,其每个节点都有一个键值,且每个节点的键值都大于等于/小于等于其父亲的键值。以大根堆为例,每个节点的键值都小于等于其父亲的键值,所以堆顶就是最大值。堆还支持插入操作,删除堆顶操作。操作时间复杂度取最值O(1)O(1)O(1)插入O(log2n)O(log_2n)O(log2n)删除堆顶O(log2n)O(log_2n)O(log2n)堆的结构最常见的堆的结构就是二叉堆,二叉堆就是完全二叉树。完全二叉树,从根往下数,除了最下层外都是全满(都有两原创 2020-12-12 22:15:18 · 128 阅读 · 0 评论 -
链表
链表数组和链表是在面试中经常问到的知识点。数组在内存中是连续存放的,所以支持随机访问,但是不支持在任意位置插入或删除元素。链表在内存中不是连续存放的,所以不支持随机访问,只能按顺序依次访问其中的元素,但是支持在任意位置插入或者删除元素。链表可以想象成是若干个节点组成的,每个节点有自己的数据,还有指向下一个节点地址的指针。单向链表单向链表里面的每个节点包含自己的数据和指向下一个节点的指针。链表的插入如果在节点A 节点B 之间加入 节点D, 就直接把节点A 的指针指向节点D, 节点D 的指针指向原创 2020-12-12 22:10:02 · 406 阅读 · 0 评论 -
队列
队列队列是一种“先进先出”的线性数据结构。可以从右端插入元素,左端弹出元素。所以第一进去的元素必然第一个出来。上图就是一个队列,队列里面有三个元素。外面有两个元素,其中1 号元素刚从队列里面出来,6 号元素是要进到队列里面。了解了队列的基本原理,我们们也可以用数组来模拟队列:定义数组和队列首尾位置,l为队首, r为队尾,一开始队列是空的 : int queue[SIZE], l = 1, r = 0;入队列 x : queue[++r] = x访问队首元素: queue[l]出队列原创 2020-12-10 16:54:54 · 759 阅读 · 0 评论 -
栈
栈 栈是一种“先进后出”的线性数据结构。栈只有一端能够进出元素。能进出元素的一端叫栈顶,不能进出元素的一端叫栈底。当我们添加或者删除元素的时候,只能从栈顶操作。上图就是一个栈,栈里面有三个元素。其中 3 号元素是栈顶,1 号元素栈底。只有当前元素是栈顶的时候才能出栈。所以上图只有 3 号元素可以出栈。如果 3 号元素出栈,那么栈顶就会变成 2 号元素。例题 实现一个栈,支持 Push(入栈)、Pop(出栈)和 GetMax (查询栈内元素的最大值)三个操作,要求时间复杂度均为 O(1).思路原创 2020-12-08 17:06:42 · 3954 阅读 · 0 评论 -
贪心
贪心 和人的贪心一样,贪心算法就是让每一步总是按照某种指标选取最优。所以不是所有的贪心都能获得最后的答案,在我们使用贪心的时候,确保自己贪心算法的正确性。 在我们无计可施的时候,也可以想一下贪心的算法,获得部分的分数。常见套路按照某种规则排序,然后按照某种顺序选择例题选讲题意:你是一个老板,想要凑够 n 元,现在有 1元,5元,10元的纸票,问最少用多少张纸票才能凑够n元。示例:输入: n = 11输出: 2解释:一张 10 元, 一张 1 元 就可以组成11元。思路:有原创 2020-11-26 09:39:41 · 96 阅读 · 0 评论 -
前缀和&&差分
前缀和&&差分 这算两个小技巧吧,下面就给大家介绍一下他们的用处。前缀和一维前缀和题意:一个长度为 n 的数组a,有 q 次询问, 每次询问有两个数 l r,问数组中区间 [l,r]之间的数之和。示例:输入:第一行两个数,分别是 n 和 q, 第二行是 n 个数, 代表数组 a,接下来是 q 行, 每行两个数 l r, 5 31 2 3 4 51 22 2 1 5输出:3215定义一个数组 sum[i] , 代表前 i 个数之和,如果想求区间 [原创 2020-11-25 17:25:06 · 159 阅读 · 0 评论 -
排序
排序 排序是一个很重有的功能,平时也会经常用到排序。这篇文章会介绍三种常用的排序算法。还有其他的排序方法,比如堆排序,归并排序等等,这些排序会在后面的内容讲述。 以下排序的对象是一个数组 a,有 n 个元素,需要从小到大进行排序。选择排序 选择排序就是 n 次选择, 每次从剩下的元素中选择一个最小的出来。 即第 i 次选择就是从 i ~ n 这些位置中的元素里面找到一个最小的元素,然后和 i 这个位置进行交换。做完 n 次选择之后,数组就会变得有序。 第1次选择找到第1小的元素放在了0原创 2020-11-25 17:24:21 · 169 阅读 · 0 评论 -
模拟
模拟 模拟这一块就是考验代码水平了,它没有很难的思维逻辑,如果是模拟题的话,就是按照题目的要求来,一步一步的实现题目中的要求。考察的就是我们如何用代码来复现题目的意思。 通过写模拟题,可以了解选手掌握语言的能力。只有掌握好了语言基础,才可能随心所欲,想怎么实现就怎么实现。 如果觉得自己语言实现能力不太行的,建议多练一下模拟题,对提升代码能力很有帮助。技巧写模拟题时,遵循以下的建议有可能会提升做题速度:在动手写代码之前,在草纸上尽可能地写好要实现的流程。在代码中,尽量把每个部分模块化,写原创 2020-11-25 17:23:40 · 480 阅读 · 0 评论 -
分治
分治 分治分治,分而治之。 所以分治这个算法的过程就是:分解 -> 解决 -> 合并。分治和递归的关系很大:递归是一种编程技巧,一种解决问题的思维方式;分治算法很大程度上是基于递归的,解决更具体问题的算法思想。分治法能解决的问题一般有如下特征:该问题的规模缩小到一定的程度就可以容易地解决。该问题可以分解为若干个规模较小的相同问题。该问题所分解出的各个子问题是相互独立的,即子问题之间没有关联。这里我们拿归并排序举个例子:归并排序归并排序的基本流程如下。void merg原创 2020-11-25 17:23:05 · 159 阅读 · 0 评论 -
二分
二分 二分查找,是用来在一个有序数组中查找某一元素的算法。算法的巧妙之处在于它的时间复杂度十分优秀。在问题的答案具有单调性的情况下,我们也可以通过二分求解转换为二分判定。 在写二分算法的时候,也有非常多的实现方式,所以细节方面要仔细思考。对于整数的二分,主要要注意一下左右边界的问题,还有最终答案的取值。对于实数的二分,就只需要注意精度的问题。原理 以在一个升序数组中查找一个数为例。 它每次取当前部分的中间位置,把当前部分一分为二,分别为左区间和右区间。查找的数在左区间,就在左区间里面接着查原创 2020-11-25 15:06:31 · 121 阅读 · 0 评论 -
递推&&递归
递推&&递归 这两个名词有一点抽象,还是通过例子来具体理解吧。例题选讲:题意:剑指 Offer 10- I. 斐波那契数列写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007)示例原创 2020-11-25 15:05:25 · 136 阅读 · 0 评论 -
Java 快速入门指南
Java 入门指南Java 程序基础操作基本数据类型整数类型: byte short,int, long浮点数类型:float,double字符类型:char布尔类型:boolean类型字节数byte1short2int4long8float4double8char2如果需要传递一个数字,没有定义变量类型100 // 默认是 int 型100L // 默认是 long 型10.0 // 默认是 doub原创 2020-11-25 14:06:54 · 317 阅读 · 0 评论 -
算法复杂度分析
复杂度分析时间复杂度每一个算法题,都会有一个时间限制和空间限制。本文就拿时间限制为 1s 来讨论.就目前来说个人计算机 1s 大概可以执行 3e8次运算左右。所以时限 1s ,我们要保证程序运算次数不超过 3e8时间复杂度一般分为 $ O(n^2) $ O(nlog2n)O(nlog_2n)O(nlog2n) O(n)O(n)O(n) O(log2n)O(log_2n)O(log2n) O(1)O(1)O(1)$O(n^2) $ 相当于两次 for原创 2020-11-25 14:02:06 · 590 阅读 · 0 评论 -
算法学习指北
Algo这是一个关于算法的项目,受众主要是哪些想刷算法,但是不知道如何下手的朋友。我之前学习Python, Java 语言的时候, 一开始看的就是文档,按照文档一点一点的看,然后跟着写代码,有时候觉得太简单了,也就不想写代码了, 过了一段时间,之前学过的东西就全忘记了。我就是单纯的想学Python,Java没有目的性的去学,学完只会也没有去练。一段时间只会必然会忘记。总结下来就是,学习一样新的东西,首先要了解,有一个总体的印象,后期需要动手实践,不断的去熟练语法规则。学习算法也是这样,用什么语言刷题原创 2020-11-25 14:01:10 · 132 阅读 · 0 评论