
算法
文章平均质量分 69
wly_2014
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
计数排序
/*******************************************************************计数排序:适用于处理满足下列情况的输入序列的排序 1、使用输入序列为正整数情况(可重复) 2、输入序列中的最大整数值不是很大计数排序:对输入序列进行排序,计数排序快于一般的比较排序,以空间换时间 如果输入序原创 2015-10-04 17:29:02 · 353 阅读 · 0 评论 -
剑指offer:二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针解题思路:1、要求一个节点(比如说用node表示)的中序遍历的下一个节点,首先判断这个节点是否有右子树,如果有右子树,那么他的下一个节点就是他右子树上最左边的节点。2、如果这个节点没有右孩子,就需要判断这个节点有没有父节点,如果原创 2016-04-07 15:14:43 · 417 阅读 · 0 评论 -
剑指offer:数组中的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。解法一:一个数字能不能构成逆序对,关键看后面有几个比他小的数字。根据这个思路,我们可以从后向前遍历整个数组。并用一个大小为10的数组,分别来保存从后向前遍历数组时0-9每个数字出现的次数。在遍历数组的每一个元素时,就可以算出这个元素对应的逆序对的个数。这样原创 2016-03-15 16:06:58 · 335 阅读 · 0 评论 -
剑指offer:对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。解题思路首先,说明一种遍历方式。我们知道先序遍历,遍历顺序分别是根、左子树、右子树。我们要说明的一种遍历顺序是根、右子树、左子树。对于上图根左右遍历序列为:1245254根右左遍历序列为:1245254可以看出如果二叉树是对称的,那么原创 2016-04-08 18:08:18 · 1043 阅读 · 0 评论 -
剑指offer:把二叉树打印成多行
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。解题思路:按层打印二叉树,即二叉树的层序遍历。使用队列即可。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) :原创 2016-04-11 17:33:57 · 338 阅读 · 0 评论 -
剑指offer:按之字形顺序打印二叉树
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。/*我的解法是用两个栈来打印,第一个栈st1打印奇数层,第二个栈st2打印偶数层。 先将根节点压入st1,然后将st1中元素出栈并访问元素,出栈的同时,将每个节点的右孩子、左孩子压入栈st2。直至栈st1空原创 2016-04-11 20:13:09 · 448 阅读 · 0 评论 -
合并表记录
题目描述数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。输入描述:先输入键值对的个数然后输入成对的index和value值,以空格隔开输出描述:输出合并后的键值对(多行)输入例子:40 10 21 23 4输出例子:0 31 23 4解题思路:这里我采用关原创 2016-04-17 17:30:41 · 899 阅读 · 0 评论 -
剑指offer:二叉树的序列化和反序列化
二叉树的序列化和反序列化//BinaryTreeNode.h文件#ifndef __BINARY_TREE_NODE__#define __BINARY_TREE_NODE__struct BinaryTreeNode{int val;struct BinaryTreeNode* left;struct BinaryTreeNode* right;Bin原创 2016-04-16 22:52:23 · 791 阅读 · 0 评论 -
分治法:循环赛日程安排问题
问题:设有n=2^k个选手参加循环赛,要求设计一个满足以下要求比赛日程表:1)每个选手必须与其它n-1个选手各赛一次;2)每个选手一天只能赛一次。分析,按照上面的要求,可以将比赛表设计成一个n行n-1列的二维表,其中第i行第j列的元素表示和第i个选手在第j天比赛的选手号。采用分治策略,可将所有参加比赛的选手分成两部分,n=2^k个选手的比赛日程表就可以通过n=2^(k-1)原创 2016-05-12 23:00:13 · 51065 阅读 · 8 评论 -
编程之美:小飞的电梯调度算法
#include #include using namespace std;int main(void){int N;cout cin >> N;int *pPerson = new int[sizeof(int) * (N + 1)];//每层有多少人int temp;int stopFloor = 0;//电梯停在第stopFloor层int原创 2016-04-20 15:59:48 · 367 阅读 · 0 评论 -
求int型数据在内存中存储时1的个数
题目描述输入一个int型数据,计算出该int型数据在内存中存储时1的个数。输入描述: 输入一个整数(int类型)输出描述: 这个数转换成2进制后,输出1的个数#includeusing namespace std;int c1 = 0x55555555;int c2 = 0x33333333;int c3 = 0x0f0f0f0f;int原创 2016-04-21 20:48:47 · 858 阅读 · 0 评论 -
华为机试:购物单
题目描述王强今天很开心,公司发给N元的年终奖。王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:主件附件电脑打印机,扫描仪书柜图书书桌台灯,文具工作椅无如果要买归类为附件原创 2016-04-22 22:06:08 · 9703 阅读 · 13 评论 -
动态规划求最长公共子序列问题
#include#include#includeusing namespace std;//找两个子串str1,str2的最长公共子串substrvoid findLongestSubString(string &str1, string &str2, string &substr){ if (str1.empty() || str2.empty()){ return; }原创 2016-05-08 21:26:41 · 588 阅读 · 0 评论 -
编程之美饮料供货:动态规划解法
#include #include #include using namespace std;struct Goods{ string name;//饮料的名字名字 int capacity;//单位饮料的容量,单位:L int maxNumber;//可供应饮料的最大数量,单位:个 int happiness;//对单位饮料的满意度 int purchaseNumber;//原创 2016-05-22 22:52:51 · 1301 阅读 · 0 评论 -
扎金花
两个搜狐的程序员加了一个月班,终于放假了,于是他们决定扎金花渡过愉快的假期 。游戏规则:共52张普通牌,牌面为2,3,4,5,6,7,8,9,10,J,Q,K,A之一,大小递增,各四张; 每人抓三张牌。两人比较手中三张牌大小,大的人获胜。 对于牌型的规则如下: 1.三张牌一样即为豹子 2.三张牌相连为顺子(A23不算顺子) 3.有且仅有两张牌一样为对子 豹子>顺子>对子>普通牌型原创 2016-06-15 22:30:12 · 2069 阅读 · 1 评论 -
剑指offer:把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。算法:这个题目最直接的做法是求出这个数组中所有数字的全排列,然后求出所有排雷的最小值。但这种算法的时间复杂度是n!上述算法1、时间复杂度高。2、排序后的数字可能超出整型所能表示的范围。原创 2016-03-13 14:28:49 · 291 阅读 · 0 评论 -
剑指offer:数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。解法:首先考虑如果数组中只有一个数字出现一次,其他的数字都出现两次,怎么找出这个只出现一次的数字?这里需要用到异或运算的性质:一个数字(不管是什么形式的数字,只要其二进制形式确定)和其自身的异或运算的结果一定位0。因此,如果一个数组中只有一个数字出现一次,其他数字都出现了两次,那原创 2016-03-13 13:13:05 · 254 阅读 · 0 评论 -
编程之美3.6-判断两链表是否相交
1、判断链表中是否有环 用追赶法:设定两个指针一个快指针fast指针,一个慢指针slow指针。从链表头结点开始遍历链表,fast指针的步长为2,slow指针的步长为1。 如果链表中存在环,fast指针和slow指针一定能够相遇。如果链表中没有环,则fast指针先到达链表尾部。 2、如果链表中有环,找出进入环的第一个结点 如果链表中有环:在slow和fast相原创 2015-10-22 09:26:42 · 332 阅读 · 0 评论 -
牛客网:确定两串乱序同构
题目描述给定两个字符串,请编写程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。这里规定大小写为不同字符,且考虑字符串重点空格。给定一个string stringA和一个string stringB,请返回一个bool,代表两串是否重新排列后可相同。保证两串的长度都小于等于5000。测试样例:"This is nowcoder","is This nowcod原创 2015-10-26 18:54:35 · 362 阅读 · 0 评论 -
剑指offer:数字在排序数组中出现的次数
题目描述统计一个数字在排序数组中出现的次数。解法与思路:数组时排序好的数组,要找一个数字在排序数组中出现的次数。首先我们想知道这个数字是否在数组出现了,这样很自然我们就会想到在一个排序的数组中找一个数字,那么应该采用二分查找,时间复杂度为o(logn)。如果这个数字在数组中,返回这个数字对应的数字下标。从这个下标开始向数组的两端遍历数组元素,并比较数组元素是否和要寻找的关键原创 2016-03-16 21:57:38 · 224 阅读 · 0 评论 -
剑指offer --- 二叉树中和为某一数的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。/*struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), l原创 2016-03-05 13:56:21 · 191 阅读 · 0 评论 -
剑指offer:求二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度解题思路:二叉树的深度 = 根节点左子树的深度与根节点右子树的深度中的较大值 + 1int TreeDepth(TreeNode* pRoot) { if (NULL == pRoot){原创 2016-03-19 11:10:22 · 271 阅读 · 0 评论 -
剑指offer:和为S的两个数字
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述:对应每个测试案例,输出两个数,小的先输出。解题思路: 1、设置两个下标(也可以是两个指针)i,j,i从0开始逐渐增大,j从数组最后一个元素的下标开始,逐渐减小;计算这两个下标对应的数组元素a[i],a[j]的和sum,并将这个和原创 2016-03-19 21:58:26 · 382 阅读 · 0 评论 -
剑指offer:和为S的连续正数序列
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输出描述:输出所有和为S的连续原创 2016-03-20 11:42:10 · 398 阅读 · 0 评论 -
剑指offer:字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。 输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。class Solution {public: vector Permutat原创 2016-03-08 19:50:27 · 275 阅读 · 0 评论 -
剑指offer:扑克牌顺子
题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12原创 2016-03-20 16:43:01 · 265 阅读 · 0 评论 -
剑指offer:包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。剑指offer给出的思路: 我们可能想使用一个变量min来存放最小的元素。每次压入栈中一个元素的时候,如果新元素比这个变量min中保存的元素小,那么就将用新元素给min赋值,即更新min的值。但是,这样存在一个问题,那就是当当前最小的元素被弹出栈了,怎么得到栈中剩余元素的最小的元素呢原创 2016-04-01 21:19:17 · 2451 阅读 · 0 评论 -
剑指offer:连续子数组的最大和
问题:求连续子数组的最大和算法1:首先用一个变量maxSum来保存最大和。从数组的第一元素开始,遍历整个数组。并用currSum来保存遍历过程中最大子数组的和。在遍历每个元素的时候:1、首先,将这个元素和最大和maxSum比较,如果大于maxSum,就将这个元素赋给maxSum。2、同时,判断当前子数组的和currSum是否大于0。如果currSum大于0,将这个元素的值和原创 2016-03-10 21:07:57 · 257 阅读 · 0 评论 -
剑指offer:数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。最笨的方法,暴力搜索,拿每一元素与数组中这个元素后面的元素比较,看是否相等,如果相等,就说明存在重复的数字。但原创 2016-03-22 20:36:27 · 374 阅读 · 0 评论 -
剑指offer:构建乘积数组
题目描述切换到MarkDown编辑器给定一个数组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[i]可以按公式给出的方法,一个个求解。时间复杂度为O(n^2)。解法二原创 2016-03-22 22:05:13 · 285 阅读 · 0 评论 -
剑指offer:判断二叉树是不是平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。算法:平衡二叉树的定义:平衡二叉树是一棵空树或者是左右子树高度差的绝对值不超过1的树,平衡二叉树的子树也是平衡二叉树。我们采用后续遍历的方式,要判断一棵二叉树是不是平衡二叉树,先判断他的左右子树是不是平衡二叉树,并返回左右子树的高度。1、如果左右子树中有一个不是平衡二叉树,那么这棵树就不是平衡的2原创 2016-03-19 11:23:04 · 734 阅读 · 0 评论 -
两字符串最长公共子序列--动态规划
首先碰到求两字符串最长公共连续子串的问题,然后想到原先做过的求两字符串最长公共子序列问题,所以又把算法导论上的解法看了一下。这两个问题是不同的问题,求最长公共子序列不要求求得的子字符串时连续的,比如说ACB和AB的最长公共子序列就是AB。而最长公共连续子串,要求求得的子串在两个字符串中必须是连续出现的,还是ACB和AB他们的最长公共子串是A或者是B。这里说的是求两字符串的最长公共子序列,用的是原创 2016-10-15 17:51:04 · 3017 阅读 · 1 评论