
算法
文章平均质量分 69
BlueBlueSkyZ
这个作者很懒,什么都没留下…
展开
-
Java刷题常用数据结构和类型转化方法总结
前言这里总结一下我感觉用java刷题经常会使用到的数据结构,包括栈、队列、堆、哈希表、有序表,以及一些类型之间转化的技巧。可能不是很全,但能够应对大部分题目需求了,后面又新加的我也会继续补充。当然这边只是一个简单的总结,真要细看方法还是去读api和底层原理吧,祝刷题顺利~正文数据结构数组实例化:ArrayList<T> arr = new ArrayList<>();方法:add、addAll、remove、set、get栈原始实例化写法:Stack<T>原创 2021-03-10 16:40:36 · 650 阅读 · 0 评论 -
在Mac配置支持C/C++的IDE(结合Sublime配置刷题环境)
前言因为本人的需求只是刷题,以前在windows上都是用codeblocks的,但是mac的codeblocks已经多年没有更新。而Mac上面的一些IDE配置真的很难用或者不符合我的需求,比如VSCode、Xcode等。正好看到Sublime完美符合我所需求的一切(比较契合刷题需求),因此总结一些过程。准备工作gcc环境terminal输入,下面的命令查看安装的版本,我的是11.0.0g++ --versionclang++ --versionsublime text 3配置先编写输原创 2020-09-28 17:15:49 · 2413 阅读 · 0 评论 -
剑指offer——数组中的逆序对
数组中的逆序对思路知识点:数组这道题一看就知道不能用暴力的方法做,必然超时。什么方法能比较数组前后的大小呢?这里就联系到了归并排序(思路见之前写的文章)。归并排序的归并操作会在归并时比较数组前后数值的大小,而与此同时时间复杂度是O(n∗lognn*\log{n}n∗logn),因此我们只要在归并的过程中统计逆序对的数量即可。我下面的代码写了两个merge,第一个merge是完全复制原来的array,如果array很大就会导致超时。因此在第二个merge改写了,只开辟需要的数组空间,这样就不会有多余原创 2020-05-31 17:20:50 · 267 阅读 · 0 评论 -
剑指offer——把二叉树打印成多行
把二叉树打印成多行思路知识点:队列、树这一看就是层次遍历,二叉树经典遍历方式之一。但是与层次遍历不同的是,每一层需要分开输出,不能无视层数输出。想到这里,得出了代码1,我将节点和层数结合成一个类TreeNodeLayer,然后将同一层的节点都存储起来,一旦层数不同了,就将存的节点放入result中,再清空存储list。这里遇到的是ArrayList的引用问题,详情见参考链接1、2,我们必须new之后加入result。代码2是牛客上的点赞第一名,确实很妙,利用了递归解决了这个问题。题目描述从上到原创 2020-05-29 11:08:08 · 315 阅读 · 0 评论 -
剑指offer——孩子们的游戏(约瑟夫环问题/圆圈中最后剩下的数)
孩子们的游戏(圆圈中最后剩下的数)思路知识点:链表 数学很经典的约瑟夫环问题,这里是逢m杀。约瑟夫环在《具体数学》中给出了任意m的公式推导,奈何具体数学学得不精,过了一段时间便忘光了,数学能力好的人可以考虑公式直接推,时间复杂度和空间复杂度绝对是最低的。我这里便利用计算机的性能,使用了模拟的方式。构建一个循环链表,然后逢m杀。代码1是我自己手动构建循环链表,并完成删除操作;代码2是利用了LinkedList这个Java自带的双向链表,以及其自带的一些函数实现的。可以看到,代码2精简了很多,因为我们原创 2020-05-26 16:46:11 · 386 阅读 · 0 评论 -
剑指offer——简单题(二)
和为S的两个数字思路知识点:数学、数组这个应该是小学就有教的数学规律吧,两个数和固定,两个数越接近,两者乘积越大。而两个数组是有序的,因此可以一个从头搜,一个从尾搜,第一个找到的就是乘积最小的组合。题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。代码 public ArrayList<Integer> FindNumbersWithSu原创 2020-05-25 23:55:21 · 305 阅读 · 0 评论 -
剑指offer——二维数组中的查找
二维数组中的查找思路知识点:查找、数组顺序递增这个一看就是有序的,有序的话直接就联想到了二分查找,时间复杂度log n。二维的话,每一行都可以进行二分查找,时间复杂度n*log n。本来有一段代码是写的是跳出条件想少判断几个状态,但碰到一个case,是空数组,直接bug,因此注释掉了。if (target > array[length-1] || target < array[0]) { return false; }描述在一个二维数组中(原创 2020-05-21 15:08:09 · 233 阅读 · 0 评论 -
剑指offer——简单题(一)
前言因为这几题太简单了,总结一下思路就行了。题目构建乘积数组思路知识点:数组其实就是for循环加个判断条件。牛客上有人调用了一些大数之类的API,感觉没啥必要。。为了AC可以,面试的时候这样是真的秀逗了。描述给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * ... * A[n-1],B[n原创 2020-05-20 21:33:41 · 308 阅读 · 0 评论 -
剑指offer——不用加减乘除做加法及相关思考
题目写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。考察知识点主要考察的是进制转换的知识点, 也有人用匹配去做,代码相当麻烦,暂时不做尝试。思路书上写到:其实思路很清晰,一下代码就写出来了。但我一直有一个疑问,如果是负数怎么办?看了很多牛客答案,都没有提到要点。要解释这个问题,理清楚位运算,以及补码的知识点尤为重要。异或操作是对每一位都进行异或(相同为0,不同为1),但需要先把数转换成补码才行原码和补码的相互转换:符号位不变,数值位按位取反,末位再加1原创 2020-05-20 17:30:29 · 193 阅读 · 0 评论 -
LeetCode 338.Counting Bits题解
题目描述题目链接 题目主要意思是输入一个非负数,让你计算从0开始到这个数相应的二进制数中有多少个1。最后返回一个数组,比如输入5,返回[0,1,1,2,1,2]分别对应0、1、10、11、100、101。 其实题目描述很简单,但是后面有要求我们用O(n)的时间复杂度来解决这个问题。思路一先将每个数字转化成二进制数,然后一位一位的判断是否为1。很显然这个方法能够解决问题,但是时间复杂...原创 2018-06-04 15:43:37 · 289 阅读 · 0 评论 -
LeetCode 100.Same Tree题解
题目题目链接奉上。 Given two binary trees, write a function to check if they are the same or not. Two binary trees are considered the same if they are structurally identical and the nodes have the s...原创 2018-05-22 19:53:28 · 387 阅读 · 0 评论 -
KMP算法的java实现
前言KMP算法看了几篇博文还是比较懵逼,主要是这个算法比较难表述清楚。阮一峰的博客 还有一篇优快云大佬写的,这两篇感觉是写的比较清楚的,超链接已经加上,大家可以去看看,我也没必要重复写了。 我感觉最最重要的是理解清楚各个概念,然后再去看代码,这样会简单一些。理一下KMP比较重要的几个概念:什么是前后缀?如何根据前后缀求部分匹配值?求得部分匹配值后怎么求next移动数组?这三个...原创 2018-05-06 11:15:00 · 710 阅读 · 3 评论 -
算法学习——图之最短路径
前言之前的两篇文章中,我主要探讨了无权图的路径问题和有权图的最小生成树。但是很多时候,我们往往更会关注两个点之间的最短路径是怎么样的?在无权图中,我们已经通过广度优先遍历找到了最短路径。但是在有权图中,最短路径其实是消耗最少的路径,因此权值在路径的查找中起着至关重要的作用。 Dijkstra最短路径原理Dijkstra也是作者的名字,在平时的应用中,Dijkstra算法也是很...原创 2018-03-14 16:10:33 · 986 阅读 · 0 评论 -
排序算法学习——O(n^2)型
前言排序算法作为最基础,也是最经典的算法,应用于我们日常生活的方方面面。而其中最为基础的三大算法——选择排序、插入排序、冒泡排序,是我们最一开始接触的排序算法。虽然当时C语言学完没有什么感觉,但现在回过头来学习算法的时候才发现其中另有一番玄机。三大排序算法这三大排序都是时间复杂度为O(n^2)的排序算法,排序效率不是很高,但在各种应用场景上仍然能发挥其作用。选择排序原理...原创 2018-02-10 17:12:33 · 567 阅读 · 0 评论 -
排序算法学习——快速排序
前言上一篇我们已经实现了一个O(NlogN)级别的归并排序,这一篇的话,我们就来实现另一个O(NlogN)级别的排序算法,鼎鼎大名的快速排序。快速排序原理我们先在数组中找到一个数,然后以这个数为基准,分成两部分,一部分小于这个数,另一部分大于这个数。完成之后,这个数就位于了正确的位置,接下来采用递归的方法对左右两边的两个数组继续进行快速排序。 代码实现代码的图片解...原创 2018-02-26 19:57:17 · 368 阅读 · 0 评论 -
点名软件—使用二项分布实现点名均匀分布
需求最近帮老师制作一个点名软件,需求是这样的: 1.每两个或一个人组队(除非出现总人数为奇数的情况,否则不会单人组队,也就是说最多一个单人队),作为小组研究一个课题2.每次上课让一个人讲ppt,另一个人回答问题,选择是随机的3.从下面不上台的人中选出三个来提问,选择也是随机的 预期1.必须保证上台的人不会出现在提问的三个人之中2.当所有组上台之后,应该避免出现有人没...原创 2017-10-21 19:27:41 · 1117 阅读 · 0 评论 -
排序算法学习——归并排序
前言上一篇文章提到了几个时间复杂度为O(N^2)的排序算法,它们实现简单,在特定场合效果也不错,但是当数据量大的时候单纯用那几个算法效果就不是很理想了。这时我们时间复杂度为O(NlogN)的算法就有了用武之地,虽然实现相对而言比较困难,但是它的效率在数据量大的情况下是O(N^2)排序算法的数百甚至上千倍,因此在实际生活中是很重要的。归并排序原理归并排序(Merge Sort...原创 2018-02-14 21:22:58 · 429 阅读 · 2 评论 -
算法学习——堆排序
前言这里和前面不同的是我把标题进行了修改。有人可能会问,同样是排序为什么去掉了排序两个字呢?这是因为,排序只是堆的一种应用。而堆作为一个数据结构,在很多应用场景下都有它的身影。二叉堆二叉堆必须为一棵完全二叉树,即叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。如图所示: 与此同时,大家还应该能看出它的第二个性质,即任意节点的值都不大于...原创 2018-03-01 11:53:43 · 397 阅读 · 0 评论 -
算法学习——图之无权图
前言经过,一段时间的学习,终于接触到了 图 这一重要的数据结构。与此同时,图在我们的生活中也起到了至关重要的作用。例如,网易云音乐的推荐、最短路径的查找等,这些场景都能利用图得到解决或者优化。图定义维基百科定义:在数学上,一个图(Graph)是表示物件与物件之间的关系的方法,是图论的基本研究对象。 图由节点(vertex)和边(edge)组成。由边的有无方向,我们又可以将...原创 2018-03-09 22:46:56 · 4633 阅读 · 0 评论 -
算法学习——图之有权图
前言上一篇文章我们讲到了图的基础,相信有了无权图的基础很快就能理解有权图了。有权图其实也是符合我们生活实际情况的,距离最短并不说明这条路线是最佳的路线,因为可能会堵车。这时候,有权图就可以帮助我们解决问题,每条道路都有一定的代价,我们的代价最小时,这条路就是最优的。有权图邻接矩阵稠密图我们依然使用邻接矩阵,不过和无权图不同的是我们就不是0、1表示了,而是使用权重进行代替。 ...原创 2018-03-11 10:25:10 · 3425 阅读 · 1 评论 -
算法学习——二叉搜索树
前言之前几篇,主要讲了排序问题,同时也涉及到了一点数据结构,比如堆。这里我将介绍一下一个重要的数据结构树。 其实之前的堆其实已经说过,它属于完全二叉树。而维基百科中讲到,单纯的树有以下特点:每个节点有零个或多个子节点;没有父节点的节点称为根节点(树叶);每一个非根节点有且只有一个父节点;除了根节点外,每个子节点可以分为多个不相交的子树; 这里我们为什么要使用二叉搜索树呢?因为它...原创 2018-03-04 14:46:38 · 477 阅读 · 2 评论 -
算法学习——并查集
前言大家肯定有听说过社交网络里面的六人理论吧,说是可以通过六个人的联系认识世界上的任意一个人。比如我想认识一下机械系的系花,我先找到机械系的朋友,然后通过朋友介绍认识。这样可以发现我们的社交圈子其实是有部分重叠的。当然也有可能是我的圈子太小,根本没有什么朋友认识那个圈子里面的人,也有很大可能是机械系花404。我们之间是否存在联系,即连接问题,这类问题往往可以通过并查集实现。并查集原...原创 2018-03-05 15:28:39 · 357 阅读 · 0 评论 -
Mahout推荐引擎介绍
转载自JavaChen Blog,作者:JavaChen 本文链接地址:http://blog.javachen.com/2014/09/22/mahout-recommend-engine.htmlMahout 是一个来自 Apache 的、开源的机器学习软件库,他主要关注于推荐引擎(协同过滤)、聚类和分类。推荐一般是基于物品或者用户进行推荐相关。聚类是讲大量的事物组合为拥有类似属性的簇,借以在转载 2017-05-01 19:19:44 · 878 阅读 · 0 评论