算法与数据结构
文章平均质量分 62
diudiuyoung
这个作者很懒,什么都没留下…
展开
-
找出一个数组中出现次数超过一半的那个数字,要求时间复杂度O(n)和空间复杂度为O(1)。
数组中超过出现次数超过一半的数字题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 分析:编程之美上也有这道题,不过它变换了题目的表述形式,如下:寻找发帖水王:Tango是微软亚洲研究院的一个试验项目,如图2-1所示。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”转载 2014-09-22 19:31:16 · 5175 阅读 · 1 评论 -
递减左旋数列中查找一个数
题目:一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}克移两位形成的,在这种数组中查找某一个数。分析:将这个数组{4,3,2,1,6,5}从任何位置分开得到的两个数组,则至少有一个数组单调递减,另一个数组则可以由某一个递减数组左移若干位得到(若要找的数在此数组中,则划分为了更小的子问题)。使用二分可以得到较高的查找效率,在二分之后确原创 2015-05-20 22:03:45 · 506 阅读 · 0 评论 -
堆排序
建初始堆 方法一:(1)从最大下标的非叶子节点开始,比较其值和左右孩子的值,进行调整,同时对调整节点的子树递归地进行类似的做法;// 调整index节点及其子树,使其满足大根堆性质,void HeapAdjust(int *a,int index,int heap_size){ int left = 2*index; int right = 2*index + 1; int dest原创 2015-05-20 22:10:44 · 278 阅读 · 0 评论 -
在二元树中找出和为某一值的所有路径(根节点到任一节点的路径)
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22和如下二元树 10 / \原创 2015-04-27 20:13:07 · 414 阅读 · 0 评论 -
输入一个整数和一棵二元树。求出从根节点到叶节点的路径长度中与输入整数相等的所有路径。
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径(必须为根到叶节点的路径)。例如输入整数22和如下二元树 10 / \原创 2015-04-27 20:11:04 · 899 阅读 · 0 评论 -
数组旋转
题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 给定一个数组data[N]和一个数M,向右旋转M位,如,char data[]="abcde", M = 2,旋转以后data 应该为cdeab ;M=3,旋转后data为deabc。当M = N时,按照定义,将M=N个元素搬到数组尾部,此时数组又回到初始状态,没有发生变化;因此当M>N时,原创 2015-03-25 14:45:51 · 320 阅读 · 0 评论 -
最长回文子串
解法一:暴力解法,取原字符串的每一个子串,判断子串是否为回文。 O(n^3)。 很多短子字符串在长子字符串中比较过,这导致了大量的冗余判断,根本原因是:对字符串对称的判断是由外向里进行的。string longestPalindrome(string s){ if (s.size()!= NULL) { string maxString; for (int原创 2015-03-30 14:51:19 · 218 阅读 · 0 评论 -
递归求两个数组的中位数(或下中位数)
描述 :已知递增有序数组a,b,长度分别为m,n。找出a,b(合并为一个大的有序数组后)的中位数(或下中位数)。要求时间复杂度为o(log(m+n)).分析 :对于数组a,若a的长度m为奇数,则a[(m-1)/2]即为中位数;若m为偶数,则a[(m-1)/2]为下中位数;可知若一个数为中位数,则它大于(m-1)/2 个数。 a,b总长度为m+n,则其中位数应该大于原创 2015-03-27 21:40:34 · 653 阅读 · 0 评论 -
求两个等长有序数组的中位数
描述:两个排序的数组,长度都为n,求合并后的排序数组的中位数。注意,此题中两个数组的长度是相等的。#include #include using namespace std;int MedianOfTwoSortArray(int a[],int b[],int n){ if (n<=0) { return -1; } if (n==1) { return (a[0原创 2015-03-27 21:33:13 · 227 阅读 · 0 评论 -
有序数组A,B的中位数
//对于长度为n的数组,当n为奇数时,其中位数只有一个,下标为(n-1)/2; n为偶数时,其中位数有上中位数和下中位数,下标分别为n/2-1 , n/2.//已知有序数组A,B,长度分别为m,n。找出A,B(合并为一个大的有序数组后)中的中位数。要求时间复杂度为o(log(m+n)).//此题中,若m+n为奇数,则返回下标为(n-1)/2的数;若为偶数,返回上中位数和下中位数的平均数。/*原创 2015-03-27 21:39:22 · 298 阅读 · 0 评论 -
哈希表
线性表、树中,记录在结构中的 相对位置是随机的,和记录的关键字之间不存在确定的关系。因此,查找的过程需要进行一系列和关键字的比较。查找的效率依赖于查找过程中所进行的比较次数。 希望的理想情况:不经过任何的比较,一次存取便能得到所查记录。必须在记录的存储位置和关键字之间建立一种一个确定的关系f, 使得每个关键字和结构中的一个唯一的存储位置相对应。只要根据对应关系f 就能找到给定K的像f(K原创 2015-03-20 10:00:13 · 251 阅读 · 0 评论 -
编程之美2.14 子数组的最大值拓展问题(首尾相连)
思路:问题的解可以分为两种情况:1)解没有跨过A[n-1]到A[0],即普通的求子数组和的最大值2)解跨过A[n-1]到A[0]对第二种情况,只要找到从A[0]开始和最大的一段(A[0],...,A[j])(0M_2=A[i]+...A[n-1]+A[0]+...+A[j]如果iM_2=A[0]+...+A[n-1] - 子数组和为负的最小值(数组元素全为正则返回0转载 2014-10-23 15:37:07 · 258 阅读 · 0 评论 -
两个字符串的第一个最长公共子串
求两个串的第一个最长公共子串,如“shaohui”,“ahui”的最大子串为“hui”。方法一:1、将两个字符串中长度较长的那个字符串作为母串strOne,另一个作为子串strTwo。设置 数组mask[strOne.size()] = {0};用于记录在母串中找到的与子串strTwo匹配的公共子串的长度;maxlength = 0; end = 0(maxlength 记录当前找到的最转载 2014-09-23 21:20:53 · 384 阅读 · 0 评论 -
n对括号有多少种匹配排列方式
n对括号有多少种匹配排列方式?比如一对括号有一种:();两对括号可以有两种:()()和(())相关知识: 卡特兰数#include using namespace std;//下述算法与没有利用到卡特兰数,只是单纯的将n对括号(共2n)个括号的所有可能排列形式的每一种进行判断,是否满足匹配;//当前位置的括号总是先(进入bracket,然后向下递归,递归至共有2n个括号,判断当前括号原创 2015-05-20 22:07:21 · 2350 阅读 · 0 评论