数据结构和算法
文章平均质量分 73
RoyKuang07
这个作者很懒,什么都没留下…
展开
-
中兴上机笔试题:计算相连的房屋块数
中兴的简历因事情太多忘记注册了,看了同学做的两道编程题,感觉都很基础,今天一个师弟拿着一到编程题来跟我讨论。题目:就是在一个网格子上,如果有房子,则该点设置为1,没有则设置为0,如果上下左右相邻的房子,则算做是一个片区的房子。对角上的(1,1)则不算。看了一眼题目,很简单的嘛。 想了个粗暴的算法,遍历每个网格点,如果为1,则用一个队列将与该点连接的所有节点设置为0。然而就是这道简单的题原创 2016-06-16 21:55:38 · 2146 阅读 · 0 评论 -
最长公共子串-简单的DP
题目描述查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。 输入描述:输入两个字符串输出描述:返回重复出现的字符输入例子:abcdefghijklmnopabcsafjklmnopqrstuvw输出例子:jklmnop很明显就是用DP来做。递推公式也很简单,在输出的时候用二维数组保存最长子串的大小,返回该子串的终止位置,原创 2016-09-05 17:00:22 · 767 阅读 · 0 评论 -
二维递增数组的查找
题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。最直接简单的算法当然是直接查找了,但是这里提供一种算法。 考虑右上角的元素,比较和目标元素的大小,依次递增xy值,直至查找到该元素为止.class Solution {public: bool Fi原创 2016-09-05 18:19:19 · 695 阅读 · 0 评论 -
返回min元素的栈
题目:设计一个栈,使得PUSH、POP以及GetMin(获取栈中最小元素)能够在常数时间内完成。分析:很刚开始很容易想到一个方法,那就是额外建立一个最小堆保存所有元素,这样每次获取最小元素只需要O(1)的时间。但是这样的话,PUSH和POP操作就需要O(lgn)的时间了(假定栈中元素个数为n),不符合题目的要求。那么用1个辅助栈如何呢?原创 2016-09-05 23:59:58 · 366 阅读 · 0 评论 -
数组中只出现一次得两个数
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路就是使用异或,但是与在成对出现的数字中查找一个单独的数字不同的是需要利用异或结果的最低位为1的flag将数组中的数字分为两类,一类是与flag按位与为0,另一类为不为0,这样再分别异或一次就能够找出这两个数。很是巧妙。其中有一个语法上容易忽略的坑:==的优先级比&高,所以&时原创 2016-09-06 01:12:44 · 401 阅读 · 0 评论 -
把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路就是定义一种比较运算,如3>32,就是位数如果不够就用最后一位去填充,一直比较完每一位为止。然后就是将vector里所有的元素按照这个大小顺序重新排列一次,依次输入stringstream,最后将原创 2016-09-06 10:58:04 · 436 阅读 · 0 评论 -
非递归遍历二叉树的方法
三种递归遍历对遍历的描述,思路非常简洁,最重要的是三种方法完全统一,大大减轻了我们理解的负担。而我们常接触到那三种非递归遍历方法,除了都使用栈,具体实现各有差异,导致了理解的模糊。本文给出了一种统一的三大非递归遍历的实现思想。三种递归遍历//前序遍历void preorder(TreeNode *root, vectorint> &path){ if(root !=原创 2016-09-07 16:19:20 · 390 阅读 · 0 评论 -
统计数组的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。题目代码思路:这个最简单的当然是直接统计了,算法时间复杂度为n^2,冒泡排序都可以。如果想进一步减少时间复杂度的话,可以考虑用递归的方法,比如使用归并排序。下面贴代码。int merge(int A[], int start,原创 2016-09-06 16:54:44 · 808 阅读 · 0 评论 -
二叉搜索书的第K个节点
二叉搜索书的第K个节点题目描述给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。题目一看就是关于二叉搜索书的中序遍历。正好可以练习一下中序遍历的非递归实现。/*struct TreeNode { int val; struct TreeNode原创 2016-09-07 17:01:42 · 508 阅读 · 0 评论 -
链表相交与环问题
转载:1、 给出两个单向链表的头指针pHead1和pHead2,判断这两个链表是否相交。假设两个链表均不带环。 示意图如下:如果两个链表相交于某一节点,那么在这个相交节点之后的所有节点都是两个链表所共有的。也就是说,如果两个链表相交,那么最后一个节点肯定是共有的。先遍历第一个链表,记住最后一个节点,然后遍历第二个链表,到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相转载 2016-09-07 21:47:04 · 305 阅读 · 0 评论 -
按之字形顺序打印二叉树
层次遍历后结果之按字输出其实我们可以借鉴层次遍历时候的思路, 参见剑指Offer–060-把二叉树打印成多行, 我们把层次遍历的结果保存在vector中每一层保存在一个vector中, 那么我们输出的时候就可以进行调整, 按照之字形输出即可 for(int i = 0; i <ans.size( ); i++) { if(i &原创 2016-09-07 22:44:00 · 309 阅读 · 0 评论 -
回溯法-求二叉树中路径和为某一定值所有路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。很明显改用回溯法:/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val原创 2016-09-07 23:04:52 · 1176 阅读 · 0 评论 -
字符串的编辑距离
题目:对于一个字符串a可以通过增加一个字符、删除一个字符、修改一个字符,将字符串a变成字符串b,例如a= abcddefgb = abcefg可以通过a字符串删除两个dd得到b字符串,也可以通过b字符串增加dd编程a字符串,从上面的分析可以知道,增加和删除的代价必须是相同的,这样a字符串变成b字符串的代价和b字符串变成a字符串的代价才会是相同的,否这可能产生代价不对原创 2016-09-05 16:50:07 · 375 阅读 · 0 评论 -
new一个二维数组的几种方法
定义二维数组char array[x][y]; 1.只定义个一维的就可以了 char *array; array = new char[x*y]; 访问的时候*(array+i*y+j)表示array[i][j] 2.定义一个二维数组 char **array1 array1 = new char *[x]; for(i=0;iarray1[i] = new c原创 2016-09-05 16:47:50 · 4600 阅读 · 0 评论 -
求数组中唯一重复的元素
在网上看到一个这样的题:一个数组中含有1001个元素,存放了1,2,3...1000和一个重复的数。只有唯一一个数是重复的,其它均只出现一次。要求设计一个算法找出这个重复的数,要求:每个数组元素只能访问一次,不用辅助存储空间。解法一:最简单的方法是,先求出1...1000的和(用公式:n(n+1)/2)sum1,然后求出arr[0]...arr[1000]的和sum2,(sum2-原创 2016-09-08 22:52:08 · 601 阅读 · 0 评论 -
最近公共祖先问题LCA
自己想的一种思路:从根节点开始,分别找到AB两个点的路径。然后保存下来,从保存的路径开始,根节点开始遍历,找到第一个不相同的节点,那么他们的前一个节点就是最近公共祖先了。问题描述求有根树的任意两个节点的最近公共祖先。分析与解法解答这个问题之前,咱们得先搞清楚到底什么是最近公共祖先。最近公共祖先简称LCA(Lowest Common Ancestor),所谓L转载 2016-09-08 23:09:46 · 1023 阅读 · 0 评论 -
一道回溯的题
吐个槽,一道典型的回溯题目竟然花了快三个小时....啊啊啊 记录一下矩阵中的路径题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e原创 2016-09-09 14:42:54 · 633 阅读 · 0 评论 -
二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:1)首先说一个很简单的思路,就是先中序遍历,将序列存入数组,然后再一个个插入双向链表。额,空间复杂度太高。但是确实好简单代码就不贴了。2)采用递归的方法。就是首先分别将左右子树变成双向链表,然后再将两个链表合并。时间复杂降低了,空间原创 2016-09-10 12:16:54 · 469 阅读 · 0 评论 -
红黑树
定义与特点红黑树的目的:由于2-3查找树是一种多叉树,实现起来较为麻烦,因此产生了红黑树。红黑树的基本思想是用标准的二叉查找树(全由2-结点构成)和一些额外的信息(替换3-结点)来表示2-3查找树。我们将树中的结点(或指向该结点的链接)分成两种类型:红链接:将两端的两个2-结点链接起来构成一个3-结点黑链接:2-3树中的普通链接红结点:将该红结点和其父结点(黑结原创 2016-08-31 17:23:06 · 431 阅读 · 0 评论 -
程序员面试金典目录
转:程序员面试金典-快课网1.1 判断一个字符串中的字符是否唯一1.2 字符串翻转1.3 去除字符串中重复字符1.8 利用已知函数判断字符串是否为另一字符串的子串2.1 从链表中移除重复结点2.2 实现一个算法从一个单链表中返回倒数第n个元素2.3 给定链表中间某结点指针,删除链表中该结点2.4 求由两个链表结点组成的数之和转载 2016-08-22 09:17:55 · 682 阅读 · 0 评论 -
刷过的算法题目汇总列表
1:测试原创 2016-08-31 17:33:24 · 474 阅读 · 0 评论 -
常见链表问题整理
链表问题在面试过程中也是很重要也很基础的一部分,链表本身很灵活,很考查编程功底,所以是很值得考的地方。我将复习过程中觉得比较好的链表问题整理了下。下面是本文所要用到链表节点的定义:struct Node{ int data; Node* next;};1. 在O(1)时间删除链表节点题目描述:给定链表的原创 2016-08-11 18:05:51 · 753 阅读 · 0 评论 -
三种线性排序算法 计数排序、桶排序与基数排序-BYVoid
转自:BYVoid[非基于比较的排序]在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销。排序算法有非常多种,如我们最常用的快速排序和堆排序等算法,这些算法需要对序列中的数据进行比较,因为被称为基于比较的排序。基于比较的排序算法是不能突破O(NlogN)的。简单证明如下:N个数有N!个可能的排列转载 2016-09-02 21:15:59 · 461 阅读 · 0 评论 -
堆排序
堆排序是另外一种常用的递归排序。因为堆排序有着优秀的排序性能,所以在软件设计中也经常使用。堆排序有着属于自己的特殊性质,和二叉平衡树基本是一致的。打一个比方说,处于大堆中的每一个数据都必须满足这样一个特性:(1)每一个array[n] 不小于array[2*n](2)每一个array[n]不小于array[2 * n + 1]构建这样一个堆只是基础,后面我们需要每次从堆的顶原创 2016-09-03 10:37:35 · 301 阅读 · 0 评论 -
哈希表总结
哈希表的概念 哈希表(Hash Table)也叫散列表,是根据关键码值(Key Value)而直接进行访问的数据结构。它通过把关键码值映射到哈希表中的一个位置来访问记录,以加快查找的速度。这个映射函数就做散列函数,存放记录的数组叫做散列表。散列存储的基本思路 以数据中每个元素的关键字K为自变量,通过散列函数H(k)计算出函数值,以该函数值作为一块原创 2016-09-03 11:55:26 · 415 阅读 · 0 评论 -
谈谈动态规划
本篇适合:做了很多动态规划题了,但是看到微软这次校招笔试的第二题http://hihocoder.com/problemset/problem/1400 还是很懵逼的同学其实直到今年5月,我都还是对动态规划比较懵逼和恐惧的。刷过很多背包,刷过LIS、LCS……然而题目稍微复杂一点,秒炸。果然鹅厂的实习生笔试题来了个 最长回文子序列 :http转载 2016-10-28 15:22:05 · 823 阅读 · 0 评论