
基础算法学习
jjwwwww
逐步成长中。。。
展开
-
八皇后问题——学习笔记
八皇后问题属于非常经典的算法问题。 先介绍下问题:在一个8*8的国际象棋中,放着八个皇后,使其互相不能攻击。每个皇后的攻击范围为:皇后所在行、列以及对角线。问题要求是找出所有可能的摆法。 这个问题其实挺像数独的,只不过数独只需要满足行列不重合即可。 然后呢,怎么解决这个问题呢,我先介绍一个比较容易接受的思路:由于任意两个皇后都不可能在同一行,所以我们可以...原创 2018-07-11 14:59:08 · 254 阅读 · 0 评论 -
二叉树非递归遍历的实现——学习笔记
二叉树非递归遍历的实现——学习笔记前言树的结构体前序遍历中序遍历后序遍历前言学过二叉树的同学一定对二叉树的三种遍历方式印象深刻。前序遍历,中序遍历,后序遍历,用递归来实现不仅代码简单而且结构优美,令人心情舒畅。那么假如我们不用递归,用循环来实现又如何呢?一起来看看。树的结构体学过树的都知道,最简单的树结构struct Tree{ int val; Tree* left;...原创 2018-10-26 23:49:44 · 762 阅读 · 0 评论 -
快速判断一个数是否为2的幂——学习笔记
2的幂有一个特点,就是其二进制数中只有一位为1,其余位均为0.1 : 000014 : 000108 : 0010016:0100032:10000…根据这个性质我们可以找到一个性质num&(num-1)==0负数由于有符号位,通过上面的判断即可排除。而当num=0时,由于0不是2的幂又满足上式,则需要单独排除。排除0以后,函数就写成这样:bool isPowe...原创 2018-10-30 10:04:57 · 512 阅读 · 0 评论 -
二维空间点到直线垂足计算公式推导及Java实现——学习笔记
二维空间点到直线垂足计算公式推导及Java实现前言公式推导代码实现画蛇添足前言简单的公式推导,大概是高中程度的知识了。不管以前学的好不好,很久不用的东西,一上手还是有点懵的。推导一遍也是为了加深记忆。公式推导首先我们知道直线上两点p1,p2:p1:(x1,y1) p_1:(x_1,y_1)p1:(x1,y1)p2:(x2,y2) p_2:(x_2,y_2)p2:(x2,y2)...原创 2018-11-07 20:13:17 · 3520 阅读 · 3 评论 -
Dijkstra算法——学习笔记
Dijkstra算法前言算法例子程序扩展前言Dijkstra算法是典型的求最短路径算法,常用于计算两点之间最短路径。算法算法具体思路是由起始点开始,层层递进向外搜索,直到找到终点为止。可设起点v0v_0v0,终点v1v_1v1,点集合V={v0}V=\{v_0\}V={v0},两点距离dv1,v2d_{v_1,v_2}dv1,v2,具体算法思路如下:1. 在集合VVV的所...原创 2018-12-10 15:49:30 · 267 阅读 · 0 评论 -
利用前序遍历和中序遍历重建二叉树
利用前序遍历和中序遍历重建二叉树前言算法思路代码实现前言遇到这么一道题,现在知道二叉树前序遍历和后序遍历,如何通过这些信息来重构二叉树。咋一看估计还有点懵,把数据拿出来细细一分析就知道,其实也还挺简单的。算法思路现在有如下数据:前序遍历 : 3 2 1 5 4 8 7 9中序遍历 : 1 2 3 4 5 7 8 9根据前序遍历的规律我们知道,前序遍历的第一位数据是根节点的数据,...原创 2019-01-04 20:55:16 · 757 阅读 · 0 评论 -
利用任意两种遍历方式重建二叉树
利用任意两种遍历方式重建二叉树前言找规律前序遍历与中序遍历中序遍历与后序遍历前序遍历与后序遍历前言学习了如何利用前序遍历和中序遍历来重建二叉树,我就在思考是否知道了任意两种遍历方式,都能将二叉树重构出来呢?仔细研究了一晚,果然如此。找规律先看三种遍历方式struct Tree{ int val; Tree *left; Tree *right;};void ...原创 2019-01-05 13:55:44 · 697 阅读 · 3 评论 -
3Sum问题——学习笔记
3Sum问题——学习笔记题目思路代码扩展题目Leetcode上面的3Sum问题。从给定的数组中找三个数,使得三数之和等于目标数值(target)思路首先我们可以把3Sum问题转化为2Sum问题。对于数组中的每一个数num,我们只需要找到另外两个数,使得这两个数的和等于(target - num)。这样的做法会有个小问题,假如此时有两个或多个相同的数,那么这些数会得到相同的结果,如此一来...原创 2019-01-14 14:42:55 · 696 阅读 · 0 评论 -
Java实现矩阵运算
Java实现矩阵运算前言代码例子前言Matlab中简单的矩阵运算,想要自己实现的话还要花一番功夫。矩阵运算的原理就不多解释了,忘记朋友们可以回头翻翻课本。代码public class MatrixCalculate { //矩阵加法 C=A+B public static double[][] MatrixAdd(double[][] m1,double[][] m2){...原创 2019-01-25 17:01:37 · 15035 阅读 · 3 评论 -
二叉树非递归遍历的实现(2)——学习笔记
二叉树非递归遍历的实现(2)——学习笔记前言思路代码前言在Leetcode上发现一个非常实用而且简单的算法,分享给各位。算法的优点在于如递归遍历一般,只需要简单调整代码的顺序,就可以轻松实现前、中、后序遍历。思路算法思路如下:先建立一个堆栈。针对堆栈中的每个节点,我们给它一个标签,false代表未遍历,true代表已遍历。出栈时遇到标记为false的节点,将其左右节点分别标记为f...原创 2019-01-16 16:09:20 · 169 阅读 · 0 评论 -
机器学习基础概率论知识——学习笔记
机器学习基本概率论知识——学习笔记期望方差期望方差协方差常用概率分布高斯分布均匀分布二项分布伯努利分布条件概率贝叶斯公式最大似然估计期望方差期望E(x)=∑xip(xi)E(\boldsymbol x)=\sum x_ip(x_i)E(x)=∑xip(xi)E(x)=∫−∞∞xf(x)dxE(x)=\int_{-\infty}^{\infty}xf(x)dxE(x)=∫−∞∞xf(x...原创 2019-03-14 14:12:18 · 279 阅读 · 0 评论 -
八大排序的实现——学习笔记
八大排序的实现——学习笔记八大排序代码实现前言辅助算法数据交换快速排序归并排序冒泡排序插入排序希尔排序选择排序基数排序堆排序八大排序代码实现前言个人学习记录,都是经典的算法,网上也有很多介绍,就没有写每个排序算法的实现逻辑了,尽量写的简洁明了,欢迎指正。辅助算法数据交换void swap(int &x1, int &x2) { int temp = x1; x1 =...原创 2019-08-01 10:22:18 · 177 阅读 · 0 评论 -
数组循环右移的N种实现方式
题目将数组循环右移k位k=0 1 2 3 4 5k=1 5 1 2 3 4k=2 4 5 1 2 3...解决这道问题可以有多种实现方式,我挑几种比较有意思的写一写。方法一void Fun(vector<int> &nums,int k){ while(--k>=0){ nums.insert(nums.begin(),nu...原创 2019-09-05 16:44:45 · 3130 阅读 · 0 评论 -
数组循环右移衍生的N个问题
文章目录前提问题一问题二方法一前提将数组循环右移k位k=0 1 2 3 4 5k=1 5 1 2 3 4k=2 4 5 1 2 3...问题一给一正常数组和数字k,返回循环右移k位的数组方法很多,请看这篇文章。问题二有一升序数组,现循环右移了k位,求k的值。方法一...原创 2019-09-06 21:20:58 · 401 阅读 · 0 评论 -
Prime算法——学习笔记
Prime算法是图论中的经典算法,用于在图中寻找最小生成树。Prime算法的原理在于:(0)首先假设有点队列V和边队列E,两个队列初始都为空(1)任取一点加入点队列V(2)在满足一端点在点队列V中,一端点(新节点)不在队列中的所有边中寻找最短边(3)把新节点加入点队列V中,把新边加入边队列E(4)重新执行(2)直到所有点都加入点队列以上图(图片搜索自百度图片)为例(...原创 2018-09-28 18:18:55 · 7171 阅读 · 1 评论 -
筛选法寻找素数——学习笔记
给定数字N,要求找到小于N的所有素数的个数。我们需要对小于N的每个数x进行判断,判断是否为素数。我们可以在[2,x-1]之间找x的因素,也可以在[2,sqrt(x)]之间找,当然平方根内查找速度更快。 我来介绍一种更快的方法——筛选法。时间复杂度O(Nlog(logN))。筛选法原理在于:1.先建立一个长度为N的数组(数组下标正好对应[0,N-1]),先假设每一个数都可能是...原创 2018-09-13 13:05:51 · 505 阅读 · 0 评论 -
约瑟夫环问题——学习笔记
约瑟夫环问题,经典的算法问题。这个问题说的是一个小故事。在很久以前,有n个犹太人遭到敌人的追击,他们逃到了一个山洞中,大部分的人决定宁愿去死也不要让敌人抓住。他们围成一圈,一个个轮流报数,报到k的人就要当场自杀,然后下一个人从1开始重新轮流数数。而约瑟夫不想自杀,于是他灵机一动,站到了圈的一个位置上,结果其他人一个个都自杀了,最后只剩下约瑟夫一个人还活着,最终他逃出了山洞。那么问题来了,约瑟夫站的...原创 2018-07-12 01:03:04 · 672 阅读 · 0 评论 -
POJ1001求高精度幂——学习笔记
前段时间看了圆周率的算法,知道了日本有一位神人近藤茂利用自己家里的电脑,将圆周率计算到小数点后10万亿位。当时我就在想,我们写程序的时候都是有位数限制的,精度最高的double也只到16位,那么我们编程的时候若是想求高精度幂该怎么办?POJ1001就是这么一道题,任意给你一个数,求其n次幂的高精度值。例如 95.123 的 12 次幂为548815620517731830194541...原创 2018-07-24 11:02:11 · 276 阅读 · 0 评论 -
约瑟夫环问题的算法优化——学习笔记
关于约瑟夫环这个问题,我前一篇文章给出的算法,时间复杂度已经达到O[n],已经是一个相当不错的算法了。然而我在网上看到Tank_long网友的博文,他在O[n]的基础上把时间复杂度又进一步下降了,而且在某些条件下极大的降低了复杂度。虽然不知道是不是这位网友原创的算法,但是这么优秀的算法,我们又岂能错过呢?那么下面就听我缓缓道来~ 我就在上一篇文章的基础之上继续往下扩展(忘记了的朋友...原创 2018-07-13 00:28:23 · 805 阅读 · 0 评论 -
二叉树基础运用——学习笔记
回想刚学二叉树的时候,被二叉树删除搞的要死要活的,后来学习了AVL树、红黑树才慢慢熟练了二叉树的基础操作。篇幅会有点长~慢慢欣赏~我就当各位都是明白什么是树,什么叫二叉树。在这里我就不多解释了~如果这些都不清楚的话,可能需要先补充些相关知识再看会比较好。 一.创建结构体struct Node { int key; int count; Node* parent; Node...原创 2018-07-15 16:10:36 · 260 阅读 · 0 评论 -
快速排序进阶之三路快排——学习笔记
最近才知道快速排序还分二路快排和三路快排,二路快排就是我们平时学习的普通快排,而三路快排虽然听起来好像要高大上一点,其实想明白了也就是一回事。 二路快排先说说二路快排,也就是普通的快速排序。排序的原理就是在待排序的数组中随机选择一个数key,把小于key的数统统放着key的左边,那么大于等于key的数都丢在右边了,得到一个新的数列:[......] < key &l...原创 2018-07-15 23:51:25 · 1961 阅读 · 0 评论 -
字符串匹配之RK算法——学习笔记
RK算法是Rabin-Karp算法的简称,是经典的字符串匹配算法,在《算法导论》上是有介绍的,有兴趣的同学可以去看看。RK算法的复杂度可以说是比上不足比下有余,比一般的匹配算法要好,但是又比不上KMP,Sunday等算法。算法表现跟快排比较相似,算法平均复杂度表现较好,但最坏情况时复杂度会相对较高。 RK算法的核心思想类似于hash函数。对于hash函数有了解的同学应该知道,我们通过h...原创 2018-08-15 00:49:22 · 2343 阅读 · 0 评论 -
C语言各类数值交换函数优缺点分析——学习笔记
方法一利用临时变量来交换void swap(int *x1,int *x2){ int temp=*x1; *x2=*x1; *x1=temp;}优点:稳妥缺点:用了临时变量,占用了空间 方法二利用加法(或减法)来交换,也可以用乘法来实现,但是除法不行(除法可能会产生小数,小数转整型会导致数值丢失)void swap(int *x...原创 2018-08-26 22:51:51 · 569 阅读 · 0 评论 -
归并排序递归和循环实现——学习笔记
归并排序是效率非常高的一种排序方式,和快速排序一样用了分治的思想。分治法的精髓在于将一个复杂问题分割成为多个简单的子问题,然后将子问题逐个解决,最终合并在一起以后就是复杂问题的解了。归并排序对数组排序时有两种实现方式,一种是利用递归来实现,另一种利用循环来实现,也可以叫自顶向下的归并排序和自底向上的归并排序。两种实现方式略有不同,但是基本思想是一样的,那听我慢慢道来。 递归版递归版...原创 2018-08-28 10:40:14 · 2423 阅读 · 0 评论 -
归并排序算法的优化——学习笔记
归并排序是一种稳定排序,时间复杂度O(nlogn),空间复杂度O(n)。那么已经非常高效的归并排序是否还能再优化呢?当然是可以的,timsort就是在归并排序上改进的一种高级排序方式,现在广泛运用在如python,Java等主流语言中。timsort是高效的,完整的算法是相当复杂的,因此我这里主要根据timsort提两个优化思路。先附上归并排序的算法://num -- 待排序的数组...原创 2018-08-28 21:50:32 · 427 阅读 · 0 评论 -
快慢指针寻找环入口——学习笔记
快慢指针常用于判断链表中是否有环和寻找链表中值。快慢指针的原理在于一快一慢两个指针,快指针每次移动两个节点,慢指针每次移动一个节点。如何判断链表有环?假如链表没环,那么快指针必然会先遇到空指针,即可判断链表无环。而当链表有环时,快慢指针必然在环内循环,那么此时快慢指针就像钟表上的时针和分针,不管怎么转总有一刻会重合在一起。可能有同学还不是特别明白。首先有个长度为n的环...原创 2018-09-01 16:58:10 · 3559 阅读 · 3 评论 -
归并排序链表的实现——学习笔记
归并排序是效率非常高的一种排序方式,和快速排序一样用了分治的思想。分治法的精髓在于将一个复杂问题分割成为多个简单的子问题,然后将子问题逐个解决,最终合并在一起以后就是复杂问题的解了。这篇文章主要讲归并排序链表的实现方式,如果想了解数组的归并排序,可移步这里。归并排序的思想其实挺简单的,简而言之就是将数列分割成子序列,先对子序列进行排序,再将排好序的子序列合并成一个完整的数列。具体例子...原创 2018-08-26 00:09:06 · 5400 阅读 · 1 评论 -
牛顿迭代法实现sqrt函数——学习笔记
牛顿迭代法又称为牛顿-拉弗森方法,它是一种在实数域和复数域上近似求解方程的方法,简而言之就是一种快速寻找近似零点的方法。牛顿法具体我不多介绍,可以直接看这篇文章,非常详细。由于很多的高阶方程没法直接求解,就是利用一个公式来不断的近似逼近零点:sqrt函数对应于方程组 的解,由于我们没法直接求得的值,所以借助于牛顿迭代法来计算。可设:带入牛顿迭代法公式可得:OK,公式...原创 2018-09-11 18:09:44 · 2058 阅读 · 1 评论 -
位运算实现加法和减法——学习笔记
Leetcode 上看到一道很有意思的题,如何不用“+”和“-”来实现数字的加减运算。既然不能用“+”和“-”,那么只能用位运算来做了,毕竟追本朔源所有的运算都是由位运算实现的。 由于二进制每一位只有0和1两个状态,因此每一位只有四种可能的运算,分别是:(1)0+0=0;(2)1+0=1;(3)0+1=1;(4)1+1=0;我们找找规律就能发现,其实就是对每一位进行...原创 2018-09-17 19:51:44 · 10603 阅读 · 5 评论 -
快速求数组A[i]+A[j]+j-i的最大值
题目快手面试题,一个随机数数组A,求A[i]+A[j]+j-i的最大值。解题思路简单来说,我们可以把数组分为两部分。左边:A[0]-0 , A[1]-1 , A[i]-i , … , A[k]-k右边:A[k+1]+k+1 , A[k+2]+k+2 , … , A[j]+j , … , A[n-1]+n-1本质上就是在左右两边分别寻找最大值,然后加起来:int Fun(vecto...原创 2019-09-18 21:30:20 · 707 阅读 · 0 评论