算法
文章平均质量分 74
「已注销」
这个作者很懒,什么都没留下…
展开
-
前缀、中缀、后缀表达式与二叉树的前序、中序、后序遍历
一、表达式与二叉树的关系前缀表达式对应于二叉树的前序遍历;中缀表达式对应于二叉树的中序遍历;后缀表达式对应于二叉树的后序遍历; 二、根据中缀表达式生成二叉树中缀表达式:a + b * (c - d) - e / f中序遍历为:左儿子、右儿子、根节点按照操作符的优先级,其二叉树生成过程为:1. c-d的优先级高,根是-操作符,c转载 2016-09-04 11:24:32 · 7720 阅读 · 0 评论 -
“中序表达式”转换为“前序表达式”、“后序表达式”
上周末参照书本写了个“计算器”的程序,其中最令我费解的就是“前序表达式”、“后续表达式”,好像记得老师在上课的时候讲过,估计当时也没听懂,看的稀里糊涂的,不过现在大概明白了…… 在此仅做以笔记。 首先看下面所示表格:中序表达式2*3/(2-1)+3*(4-1)前序表达式+/*23-21*3-41转载 2016-09-04 11:23:47 · 4205 阅读 · 0 评论 -
字符串移位包含的问题
问题:给定两个字符串s1和s2,要求判断s2是否能够被通过s1做循环移位(rotate)得到的字符串包含。例如,S1=AABCD和s2=CDAA,返回true;给定s1=ABCD和s2=ACBD,返回false。解法一:从题目中可以看出,我们可以使用最直接的方法对S1进行循环移动,再进行字符串包含的判断,从而遍历其所有的可能性。字符串循环移动,时间复杂度为O(n),字符串包含判断,采用普通转载 2016-09-03 21:33:04 · 752 阅读 · 0 评论 -
连续子数组最大和问题
1. 问题描述输入一个整形数组,求数组中连续的子数组使其和最大。比如,数组x应该返回 x[2..6]的和187.2. 问题解决我们很自然地能想到穷举的办法,穷举所有的子数组的之和,找出最大值。穷举法i, j的for循环表示x[i..j],k的for循环用来计算x[i..j]之和。maxsofar = 0for i = [0, n)转载 2016-09-03 21:20:19 · 361 阅读 · 0 评论 -
排序算法——快速排序
今天介绍快速排序,这也是在实际中最常用的一种排序算法,速度快,效率高。就像名字一样,快速排序是最优秀的一种排序算法。思想快速排序采用的思想是分治思想。快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n原创 2016-08-24 19:46:43 · 305 阅读 · 0 评论 -
算法:已经二叉树的前序遍历和中序遍历 写出后序遍历算法
该题本人在2016年参加网易java后天面试时遇到过的算法题,手写代码:前序遍历:根左右中序遍历:左根右后序遍历:左右根#include int find(char c,char A[],int s,int e){ /* 找出中序中根的位置。 */ int i; for(i=s;i if(A[i]==c) return i; }}原创 2016-08-23 13:30:55 · 873 阅读 · 0 评论 -
LeetCode:Reverse String
最近新加的一道题,用C++秒过,12秒,反转字符串,思路很简单,一种暴力方法就用直接用一个新的字符串存储,然后一个一个从后往前遍历旧的字符串。第二种就是原地用2个指针从两端往中间扫描,当left指针小于right指针时,就交换两个下标对应的值,否则就跳出循环。两种方法都是12ms过。同学用java做的时候遇到了坑,time limit exceed,好像是对于回车换行的情况,java的stri原创 2016-08-31 20:19:59 · 408 阅读 · 0 评论 -
单链表逆序
2、 单链表逆序 第二个题目是很经典的“单链表逆序”问题。很多公司的面试题库中都有这道题,有的公司明确题目要求不能使用额外的节点存储空间,有的没有明确说明,但是如果面试者使用了额外的节点存储空间做中转,会得到一个比较低的分数。如何在不使用额外存储节点的情况下使一个单链表的所有节点逆序?我们先用迭代循环的思想来分析这个问题,链表的初始状态如图(1)所示:图(1转载 2016-09-11 13:58:37 · 5747 阅读 · 2 评论 -
【编程之美】读书笔记:寻找最大的K个数
问题:查找大量无序元素中最大的K个数。 解法一:该解法是大部分能想到的,也是第一想到的方法。假设数据量不大,可以先用快速排序或堆排序,他们的平均时间复杂度为O(N*logN),然后取出前K个,时间复杂度为O(K),总的时间复杂度为O(N*logN)+O(K). 当K=1时,上面的算法的时间复杂度也是O(N*logN),上面的算法是把整个数组都进行了排序,而转载 2016-08-30 21:42:49 · 494 阅读 · 0 评论 -
前序 中序 后序 遍历二叉树 - 前缀 中缀 后缀 表达式
前序遍历: 根-左-右中序遍历: 左-根-右后序遍历: 左-右-根总结: 以根为中心,前序就先根,中序就中根,后序就后根。前序表达式: 对应着前序遍历中序表达式: 对应着中序遍历后序表达式: 对应着后序遍历例子:A = B / (C+D) * E - F转载 2016-09-04 11:26:21 · 1501 阅读 · 1 评论 -
从B 树、B+ 树、B* 树谈到R 树
第一节、B树、B+树、B*树1.前言:动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)。前三者是典型的二叉查找树结构,其查找的时间复杂度O(log2N)与树的深度相关,那么降低树转载 2016-08-25 15:05:06 · 363 阅读 · 0 评论 -
打印二叉树所有的路径
问题:给一个二叉树,把所有的路径都打印出来。比如,对于下面这个二叉树,它所有的路径为:8 -> 3 -> 18 -> 2 -> 6 -> 48 -> 3 -> 6 -> 78 -> 10 -> 14 -> 13思路:从根节点开始,把自己的值放在一个数组里,然后把这个数组传给它的子节点,子节点同样把自己的值放在这个数组里,又传给转载 2016-09-17 10:23:46 · 3140 阅读 · 0 评论 -
图算法概论
1. 图的表示图的表示法有两种,邻接表和邻接矩阵法,这两种方法既可以表示有向图也可以用于表示无向图。邻接表方法在稀疏的图中比较节省资源,但是邻接矩阵法在密度比较高的情况下比较好。2. 搜索算法搜索一个图示有序地沿着图的边访问所有的定点,图的搜索技术是图算法领域的核心a. 广度优先搜索(Breadth-first search,BFS)过程:转载 2016-09-25 20:54:38 · 486 阅读 · 0 评论 -
使用随机算法产生一个数,要求把1-1000W之间这些数全部生成
使用随机算法产生一个数,要求把1-1000W之间这些数全部生成。(考察高效率,解决产生冲突的问题)代码虽然实现了。提高效率的地方有如下:1.初始化set集合的时候 Sets.newHashSetWithExpectedSize(value),给初始化带个固定大小,减少了集合在扩容的时候,值重新复制的问题。这的效率稍有提高。2.Random random = new Ra转载 2016-09-24 21:24:02 · 6630 阅读 · 2 评论 -
五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法
分治算法一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题转载 2016-09-07 16:02:02 · 703 阅读 · 0 评论 -
Java - 华为机试训练 - 简单密码破解
空间限制:32768K本题知识点: 字符串 算法知识视频讲解题目描述密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。哇哈哈. 接下来渊子要在密码之上再加一套密码,虽然简单但也安全。 假设渊子原来一个BBS上的密码为zvbo9441987,为了方便记忆,他通过一种算法把这个密码变换成YUANzhi1987,这个密码是他的名字和转载 2016-09-06 09:38:58 · 1955 阅读 · 0 评论 -
求一个数组中第k大的数方法
求一个数组中第k大的数,我第一印象是冒泡,因为只要冒泡k趟即可,第一趟冒泡第一大,第二次冒泡第二大,第k次冒泡第k大,时间复杂度为O(kn),n为数组长度。但是我们都知道快速排序是对冒泡的改进,降低冒泡的递归深度,使时间复杂度降低到O(nlgn),为什么不用快排呢?那么快排的时间复杂度又是多少呢?因为快排每次将数组划分为两组加一个枢纽元素,每一趟划分你只需要将k与枢纽元素的下标进行比较,如转载 2016-09-17 18:54:07 · 2134 阅读 · 0 评论 -
判断二叉树是否平衡 java
实现一个函数,检查二叉树是否平衡。二叉树平衡的定义如下:任意一个结点,其两颗子树的高度差不超过1递归访问每个整棵树,计算每个结点子树的高度[java] view plain copypublic class BTreeBalanced { static class TreeNode { in转载 2016-09-17 15:23:59 · 520 阅读 · 0 评论 -
剑指offer系列源码-八皇后问题 C语言
题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请求出总共有多少种摆法。 这就是有名的八皇后问题。解决这个问题通常需要用递归,而递归对编程能力的要求比较高。因此有不少面试官青睐这个题目,用来考察应聘者的分析复杂问题的能力以及编程的能力。转载 2016-09-17 11:10:07 · 953 阅读 · 0 评论 -
字符串排列和组合的JAVA实现
字符串的组合:给一个字符串,比如ABC, 把所有的组合,即:A, B, C, AB, AC, BC, ABC, 都找出来。解题思路:假设我们想在长度为n的字符串中求m个字符的组合。我们先从头扫描字符串的第一个字符。针对第一个字符,我们有两种选择:一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符;二是不把这个字符放到组合中去,接下来我们需要在剩转载 2016-09-17 11:01:16 · 2744 阅读 · 1 评论 -
二分法
1.特点及概念介绍 下面给大家讲解一下"二分法查找"这个java基础查找算法,那么什么是二分法呢?其实所谓的"二分法",就是一分为二的意思,综合起来理解就是一分为二的查找,但大家记住了,二分法是建立在"已经按顺序排好"的基础条件上,如果大家把这个二分法查找理解清楚了,那么会有助于你更好的理解快速排序,下面我就罗列出该算法的特点: 1.定义起始位置start(0角标),定义末位置原创 2016-08-30 21:05:59 · 943 阅读 · 0 评论 -
链表的快慢指针:查找中点
一直做题都是数组中点,直接算n/2,但是链表的中点怎么求出来,我还真没见过,只能说自己做题太少了。今天做leetcode上的题就遇到了,虽然说简单,但对我来说这是个新的知识点,我得记录一下,代码如下:[cpp] view plain copyListNode* findMidNode(ListNode* head) { Li转载 2016-09-11 10:50:34 · 4297 阅读 · 4 评论 -
红黑树
本文参考:I、 The Art of Computer Programming Volume III、 Introduction to Algorithms, Second EditionIII、The Annotated STL SourcesIV、 WikipediaV、 Algorithms In C Third EditionVI、 本人写的关于红黑树的前三转载 2016-08-30 16:56:43 · 278 阅读 · 0 评论 -
【剑指offer】栈的压入、弹出序列(java版)
【分析】问题描述在程序注释中体现,主要思想是:创建一个辅助的堆栈,定义一个指向弹出序列第一位的指针,对于压入序列,每个数压入辅助栈中,每当压入一个数进行判断:栈顶元素与弹出序列指针所指的数进行比较,若相同则弹栈,同时指针后移一位,直到栈顶元素与指针所指元素不同,则压入下一个压入序列中的数。最终若辅助栈为空说明弹出序列为压入序列的弹出顺序。【代码:链表版】/*问题:输入两个整数序列,原创 2016-08-04 22:07:57 · 2109 阅读 · 0 评论 -
比较重量
[编程题] 比较重量小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量。这些钻石的重量各不相同。在他们们比较了一段时间后,它们看中了两颗钻石g1和g2。现在请你根据之前比较的信息判断这两颗钻石的哪颗更重。给定两颗钻石的编号g1,g2,编号从1开始,同时给定关系数组vector,其中元素为一些二元组,第一个元素为一次比较中较重的钻石的编号,第二个元素为较轻的钻石原创 2016-07-31 20:58:58 · 594 阅读 · 0 评论 -
归并排序
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。[cpp] view plain copy原创 2016-08-16 10:52:05 · 289 阅读 · 0 评论 -
【LeetCode】Partition List 解题报告
【题目描述】Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.You should preserve the original relative order of the node原创 2016-08-03 17:07:12 · 371 阅读 · 0 评论 -
二分查找算法
二分查找算法 二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为: 1.第一步查找中间元素,即5,由于5原创 2016-07-19 10:37:27 · 448 阅读 · 0 评论 -
Hash算法
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。 HAS原创 2016-07-28 22:33:35 · 571 阅读 · 0 评论 -
median-of-two-sorted-arrays
题目描述There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).分析:两种思路原创 2016-07-27 20:46:32 · 268 阅读 · 0 评论 -
add-two-numbers
题目描述You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it原创 2016-07-27 20:02:37 · 246 阅读 · 0 评论 -
Two Sum
题目描述Given an array of integers, find two numbers such that they add up to a specific target number.The function twoSum should return indices of the two numbers such that they add up to原创 2016-07-27 19:32:55 · 318 阅读 · 0 评论 -
【剑指offer】二叉搜索树的后序遍历序列
【题目】输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。【分析】 首先我们观察题目:二叉搜索树,后序遍历两个知识点。 二叉搜索树,用于搜索,因此内部节点没有重复的元素。另外,满足二叉树的性质,左子树都比自己小,右子树都比自己大。那么可想而知,如果按照后原创 2016-08-04 22:21:52 · 539 阅读 · 0 评论 -
【剑指offer】二叉树中和为某一值得路径 java
路径为从根节点到叶节点一条路径,路径经过的各节点数值之和等于某一给定数值,则打印路径上的节点因为需要打印满足条件的路径节点信息和各节点之和,需要栈记录经过的节点,和一个保存数值之和的变量用前序遍历方法,可以首先访问节点,然后将节点入栈,并将数值和之前入栈的节点值相加如果当前之和否满足给定值,判断当前节点是否叶节点,是则打印路径信息判断节点左右孩子是否为空,递归调用在调用完,返回时要将入栈的原创 2016-08-04 22:36:13 · 1221 阅读 · 0 评论 -
不借助第三个变量交换两个整数
假设两个数x和y,则有:方法1,算术运算(加减):x=x+y; //x暂存两数之和y=x-y; //y为两数之和减去y,即原来的xx=x-y; //x为两数之和减去现在的y(原来的x),变成原来的y方法2,逻辑运算(异或):x^=y;//x转载 2016-08-06 21:40:06 · 9540 阅读 · 2 评论 -
经典排序算法 - 桶排序Bucket sort
经典排序算法 - 桶排序Bucket sort补充说明三点1,桶排序是稳定的2,桶排序是常见排序里最快的一种,比快排还要快…大多数情况下3,桶排序非常快,但是同时也非常耗空间,基本上是最耗空间的一种排序算法我自己的理解哈,可能与网上说的有一些出入,大体都是同样的原理无序数组有个要求,就是成员隶属于固定(有限的)的区间,如范围为[0-9](考试转载 2016-08-30 16:53:38 · 384 阅读 · 0 评论 -
海量数据处理之Bloom Filter详解
前言 本博客内曾已经整理过十道海量数据处理面试题与十个方法大总结。接下来,本博客内会重点分析那些海量数据处理的方法,并重写十道海量数据处理的面试题。如果有任何问题,欢迎不吝指正。谢谢。一、什么是Bloom Filter Bloom Filter是一种空间效率很高的随机数据结构,它的原理是,当一个元素被加入集合时,通过K个Hash函数将这个元素映射成一个位阵列(B原创 2016-08-19 15:40:05 · 2918 阅读 · 0 评论 -
大数据量的算法面试题
原链接:http://blog.csdn.net/v_july_v/article/details/7382693何谓海量数据处理? 所谓海量数据处理,无非就是基于海量数据上的存储、处理、操作。何谓海量,就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导致无法一次性装入内存。 那解决办法呢?针对时间,我们可以采用巧妙的算法搭配合适的数据结构转载 2016-08-19 15:16:28 · 11446 阅读 · 0 评论 -
华为上机--放苹果
对于m个苹果,n个盘子f(m,n):如果m如果m>n,那么有两种情况:一种有空盘子的情况,一种没有空盘子的情况,两种情况不重叠且加一起一定为情况总数。第一种情况:m个苹果放在n-1个盘子里,因为至少有1个空盘子,即f(m,n-1)第二种情况:每个盘子都至少有一个苹果,m-n个苹果再放到n个盘子里,即f(m-n,n)。由上面两种情况得到递归式f(m,n)=f(原创 2016-08-18 20:26:09 · 326 阅读 · 0 评论 -
华为上机--求最小公倍数
题目描述正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。输入描述:输入两个正整数A和B。输出描述:输出A和B的最小公倍数。输入例子:5 7输出例子:35代码a*b/最大公约数import java.util.Scanner;原创 2016-08-18 19:58:37 · 419 阅读 · 0 评论