
数据结构与算法
rocling
我思故我在
展开
-
疯狂java笔记之树和二叉树
树的概述树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构1.树的定义和基本术语计算机世界里的树,是从自然界中实际的树抽象而来的,它指的是N个有父子关系的节点的有限集合。对于这个有限的节点集合而言,它满足如下条件:当N=0时,改节点集合为空,这课树也被称为空树 在任意的非空树中,有且仅有一个根(root)节点 当N>1时,除根节点...原创 2019-12-18 22:22:47 · 261 阅读 · 0 评论 -
求所有根节点到叶子节点的二叉树路径
给一棵二叉树,返回所有从根节点到叶子节点的路径,用list存储例如,下面的二叉树: 1 / \2 3 \ 5路径:["1->2->5", "1->3"]思路:这道题我想多了,我用的非递归双栈模拟实现的,其实根本用不着,递归实现就行。递归版:public List<String> binaryTreeP...原创 2019-12-13 18:01:25 · 680 阅读 · 0 评论 -
实战算法——多叉树全路径遍历(完整版)
目录前言递归和非递归比较递归非递归递归的劣势和优势问题构建问题解决递归方法非递归方法测试结论前言本文研究的是如何对一个多叉树进行全路径的遍历,并输出全路径结果。该问题的研究可以用在:Trie树中查看所有字典值这个问题上。本文将对该问题进行详细的模拟及进行代码实现,讨论了递归和非递归两种方法优劣并分别进行实现,如果读者对这两种方法的优劣不感兴...原创 2019-12-13 17:30:26 · 7827 阅读 · 3 评论 -
白话经典算法系列之十七 数组中只出现一次的数
首先看看题目要求:数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次。请给出最快的方法找到x。这个题目非常有意思,在本人博客中有《位操作基础篇之位操作全面总结》这篇文章介绍了使用位操作的异或来解决——数组中其他数字出现二次,而x出现一次,找出x。有《【白话经典算法系列之十二】数组中只出现1次的两个数字(百度面试题)》这边文章介绍了分组异或的方法来解决——数组中其他数字出现...原创 2019-12-01 12:38:11 · 125 阅读 · 0 评论 -
白话经典算法系列之十六 “基数排序”之数组中缺失的数字
首先看看题目要求:给定一个无序的整数数组,怎么找到第一个大于0,并且不在此数组的整数。比如[1,2,0]返回3,[3,4,-1,1]返回2,[1, 5, 3, 4, 2]返回6,[100, 3, 2, 1, 6,8, 5]返回4。要求使用O(1)空间和O(n)时间。这道题目初看没有太好的思路,但是借鉴下《白话经典算法系列之十 一道有趣的GOOGLE面试题》这篇文章,我们不发现使用“基数排...原创 2019-12-01 12:33:20 · 145 阅读 · 0 评论 -
白话经典算法系列之十五 “一步千里”之数组找数
首先看看题目要求(题目来源:http://weibo.com/lirenchen,特此鸣谢):有这样一个数组A,大小为n,相邻元素差的绝对值都是1。如:A={4,5,6,5,6,7,8,9,10,9}。现在,给定A和目标整数t,请找到t在A中的位置。除了依次遍历,还有更好的方法么?这道题目的解法非常有趣。这道题目的解法非常有趣。数组第一个数为array[0], 要找的数为y,设t ...原创 2019-12-01 12:28:42 · 163 阅读 · 0 评论 -
白话经典算法系列之十三 随机生成和为S的N个正整数——投影法
【白话经典算法系列之十三】随机生成和为S的N个正整数——投影法随机生成和为S的N个正整数有很多种解法。下面讲解一种比较高效且比较有趣味性的解法——投影法。以生成和为20的4个数为例,可以先生成随机生成0到20之间的三个数字再排序,假设得到了4,7,18。然后在X-Y数轴上画出这三个数,如下图:然后将这些数值投影到Y轴上,可得下图:由图很容易看出AB,BC,CD,DE这四段的...原创 2019-12-01 12:20:44 · 224 阅读 · 0 评论 -
白话经典算法系列之十二 数组中只出现1次的两个数字(百度面试题)
首先来看题目要求:在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字。考虑下这个题目的简化版——数组中除一个数字只出现1次外,其它数字都成对出现,要求尽快找出这个数字。这个题目在之前的《位操作基础篇之位操作全面总结》中的“位操作趣味应用”中就已经给出解答了。根据异或运算的特点,直接异或一次就可以找出这个数字。现在数组中有两个数字只出现1次...原创 2019-12-01 12:15:01 · 163 阅读 · 0 评论 -
白话经典算法系列之十一 一道有趣的GOOGLE面试题 --【解法2】
上一篇《白话经典算法系列之十一道有趣的GOOGLE面试题》中对一道有趣的GOOGLE面试题进行了详细的讲解,使用了类似于基数排序的做法在O(N)的时间复杂度和O(1)的空间复杂度完成了题目的要求,文章发表后,网友fengchaokobe在评论中给出了另一种解法,见下图。文字版:int Repeat(int *a, int n){ for(int i = 0; i < n;...原创 2019-12-01 11:55:13 · 150 阅读 · 0 评论 -
白话经典算法系列之十 一道有趣的GOOGLE面试题
最近在微博上看到一道有趣的GOOGLE面试题,见下图:文字版:一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间。这个题目要求用O(n)的时间复杂度,这意味着只能遍历数组一次。同时还要寻找重复元素,很容易想到建立哈希表来完成,遍历数组时将每个元素映射到哈希表中,如果哈希表中已经存在这个元素则说明这就是个重...原创 2019-12-01 11:50:14 · 159 阅读 · 0 评论 -
白话经典算法系列之九 从归并排序到数列的逆序数对(微软笔试题)
首先来看看微软2010年笔试原题:在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序数对。一个排列中逆序的总数就称为这个排列的逆序数。如{2,4,3,1}中,2和1,4和3,4和1,3和1是逆序数对,因此整个数组的逆序数对个数为4,现在给定一数组,要求统计出该数组的逆序数对个数。计算数列的逆序数对个数最简单的方便就最从前向后依次统计每个数字...原创 2019-12-01 11:30:58 · 129 阅读 · 0 评论 -
白话经典算法系列之八 白话经典算法之七大排序总结篇
目录一.冒泡排序二.直接插入排序三.希尔排序四.直接选择排序五.归并排序六.快速排序七.堆排序在我的博客对冒泡排序,直接插入排序,希尔排序,直接选择排序,归并排序,快速排序和堆排序这七种常用的排序方法进行了详细的讲解,并做成了电子书以供大家下载。下载地址为:http://download.youkuaiyun.com/detail/morewindows/4443208。...原创 2019-12-01 11:22:31 · 125 阅读 · 0 评论 -
白话经典算法系列之七 堆与堆排序
堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先讲解下什么是数据结构中的二叉堆。二叉堆的定义二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总是大于或等于任何一个...原创 2019-11-30 23:58:46 · 143 阅读 · 0 评论 -
白话经典算法系列之六 快速排序 快速搞定
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速排序...原创 2019-11-30 23:39:24 · 157 阅读 · 0 评论 -
白话经典算法系列之五 归并排序的实现
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。//将有序数组a[]和b[]合并到c[]中void Memer...原创 2019-11-30 23:25:04 · 103 阅读 · 0 评论 -
白话经典算法系列之四 直接选择排序及交换二个数据的正确实现
直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接播放排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后。设数组为a[0…n-1]。1.初始时,数组全为无序区为a[0..n-1]。令i=02.在无序区a[i…n-1]中选取一个最小的元素,将其与a[i]交换。...原创 2019-11-30 23:12:02 · 128 阅读 · 0 评论 -
白话经典算法系列之三 希尔排序的实现
希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因...原创 2019-11-30 23:04:07 · 193 阅读 · 0 评论 -
白话经典算法系列之二 直接插入排序的三种实现
直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。设数组为a[0…n-1]。1.初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=12.将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。3....原创 2019-11-30 22:45:38 · 114 阅读 · 0 评论 -
白话经典算法系列之一 冒泡排序的三种实现
本文链接:https://blog.youkuaiyun.com/MoreWindows/article/details/6657829冒泡排序是非常容易理解和实现,,以从小到大排序举例:设数组长度为N。1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。3.N=N-1...原创 2019-11-30 22:38:14 · 136 阅读 · 0 评论 -
判断两个链表是否相交
JAVA堆和栈比较两个链表,判断是否相交,找出相交的第一个点?首先应该清楚两个单链表相交要么都是无环链表,要么都是有环链表,不存在一个有环链表和一个无环链表相交,因为两个链表一旦相交则后续的链表都应该是相同的(1)将其中任意一个链表的环打破,即让尾结点指向null(记下保存原本应当指向的位置),然后判断第二个链表是否含有环,若第二个链表无环则相交,否则不相交(2)利用判断单...原创 2019-11-29 21:10:37 · 345 阅读 · 0 评论 -
简单图论:遍历所有最短路径
今天遇到了两道要求遍历所有最短路径的题,我一直做不对的原因竟是我把无向图当成了有向图,郁闷的要死。解决遍历所有最短路径,其实思路很简单,首先通过经典算法[各种算法,求出最短路径的长度,然后就只能DFS来找寻起始点、终点一样,长度为最短路径长度的路径即可,在DFS中可以使用数组来保存路径。DFS时注意要剪枝,路径上已经走过的点不要重复走,可以用来保存。这里要注意的是,如果边的权均为正,那...原创 2019-11-22 10:51:04 · 7405 阅读 · 1 评论 -
返回值、全局变量和异常三种错误处理方式的优缺点比较
原创 2019-03-05 22:45:32 · 663 阅读 · 0 评论 -
计算机算法基础总结
作者:Jerry4me链接:https://www.jianshu.com/p/f6e35db6bc51 我的Github地址:https://github.com/Jerry4medemo:https://github.com/Jerry4me/JRBaseAlgorithm 本文主要是通过通俗易懂的算法和自然语言, 向大家介绍基础的计算机排序算法和查找算法, 还...转载 2018-12-26 20:24:40 · 1060 阅读 · 0 评论 -
如果看了此文你还不懂傅里叶变换,那就过来掐死我吧【完整版】
原文出处: 韩昊 http://blog.jobbole.com/70549/ 1 2 3 4 5 6 7 8 9 10 作 者:韩 昊 知 乎:Heinrich 微 博:@花生油工人 知乎专栏:与时间无关的故事 谨以此文献给大连海事大学的吴楠老师...转载 2018-09-06 20:17:55 · 186 阅读 · 0 评论 -
常见的几种排序方法--javascript版
目录1.背景介绍2.知识剖析3.常见问题4.解决方案冒泡排序选择排序(Selection sort)插入排序(英语:Insertion Sort)快速排序5.扩展思考6.参考文献7.更多讨论 1.背景介绍在计算机科学与数学中,一个排序算法(英语:Sorting algorithm)是一种能将一串资料依照特定排序方式进行排列的一种算法。 最常用...原创 2018-09-06 20:18:41 · 516 阅读 · 0 评论 -
八大排序算法
概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间...原创 2018-09-06 20:18:48 · 108 阅读 · 0 评论 -
数据结构常见的八大排序算法(详细整理)
前言八大排序,三大查找是《数据结构》当中非常基础的知识点,在这里为了复习顺带总结了一下常见的八种排序算法。常见的八大排序算法,他们之间关系如下: 他们的性能比较: 下面,利用Python分别将他们进行实现。直接插入排序算法思想:直接插入排序的核心思想就是:将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元...原创 2018-09-06 20:19:04 · 247 阅读 · 0 评论