![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
Shawn_Mei_
---
展开
-
KMP的next数组详解
KMP的next数组简单来说,假设有两个字符串,一个是待匹配的字符串strText,一个是要查找的关键字strKey。现在我们要在strText中去查找是否包含strKey,用i来表示strText遍历到了哪个字符,用j来表示strKey匹配到了哪个字符。 如果是暴力的查找方法,当strText[i]和strKey[j]匹配失败的时候,i和j都要回退,然后从i-j的下一个字符开始重新匹配。 而...转载 2018-05-22 19:42:04 · 1330 阅读 · 0 评论 -
011用两个队列实现栈
/* * 用两个队列实现栈 * * 题目:用两个队列实现一个栈。栈的声明如下,请实现它的两个函数stack_push * 和stack_pop,分别完成在栈顶加入元素和弹出元素。 * * 思路:结点总是插入queue1,当queue1只有一个元素,弹出它;当queue1多于一个元素, * 依次取出其队首元素存入queue2,直至剩最后一个元素,弹出;若queue1为空,转到queue...原创 2018-07-25 20:48:09 · 122 阅读 · 0 评论 -
012斐波那契数列
/* * 斐波那契数列 * * 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。 * * 思路:递归方法时间复杂度达到O(2^n),不实用,采用迭代方法,采用中间变量 * 记录结果,时间复杂度O(n) */#include <iostream>using namespace std;class solution{public:...原创 2018-07-25 20:49:12 · 169 阅读 · 0 评论 -
016矩阵中的路径
// 矩阵中的路径// 题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有// 字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左、右、// 上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入// 该格子。例如在下面的3×4的矩阵中包含一条字符串“BFCE”的路径。但矩阵中不// 包含字符串“ABFB”的路径,因为字符串的第一个字符...原创 2018-07-28 22:55:11 · 87 阅读 · 0 评论 -
017机器人的运动范围
// 机器人的运动范围// 题目:地上有一个m行n列的方格。一个机器人从坐标(0, 0)的格子开始移动,它// 每一次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和// 大于k的格子,也不能重复进入已走过的格子,例如,当k为18时,机器人能够进入方格(35, 37),// 因为3+5+3+7=18。但它不能进入方格(35, 38),因为3+5+3+8=19。请问该机器人...原创 2018-07-28 22:55:51 · 127 阅读 · 0 评论 -
018剪绳子
// 剪绳子 // // 题目:给你一根长度为n绳子,请把绳子剪成m段(m、n都是整数,n&gt;1并且m≥1)。 // 每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0]k[1]…*k[m]可能的最大乘 // 积是多少?例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此 // 时得到最大的乘积18。 // // 思路:1.动态规划——平凡情况,n为0,...原创 2018-07-29 19:16:17 · 125 阅读 · 0 评论 -
019硬币问题
// 硬币问题//// 问题:我们有面值为1元3元5元的硬币若干枚,如何用最少的硬币凑够n元(n为整数,其他输入返回0)?//// 思路:1.动态规划——平凡情况:n <= 0, 返回0, n为1,2,3,4,5时,返回1,2,1,2,1;n >= 6时,每次最后一次拿的// 硬币面额为1,3,5中的一种,最优解应该是前一次最优解加一,即f(n) = f(n - i) + 1...原创 2018-07-29 19:17:55 · 342 阅读 · 0 评论 -
020跳跃游戏
// 跳跃游戏//// 题目:// 给定一个非负整数数组,您最初定位在数组的第一个索引处。// 数组中的每个元素表示该位置的最大跳转长度。// 您的目标是以最小跳跃次数到达最后一个索引。// 例:// 输入:[2, 3, 1, 1, 4]// 输出: 2// 说明:到达最后一个索引的最小跳转次数为2。// 从索引0跳转1步到1,然后从最后一个索引跳3步。// 注意:// 您...原创 2018-07-29 19:18:54 · 148 阅读 · 0 评论 -
013青蛙跳台阶、矩形覆盖问题
/* * 1.青蛙跳台阶 * * 问题: 青蛙一次可以跳一级台阶,也可以跳两级, * 问跳到n级台阶有多少种不同跳法 * * 思路:n级台阶有f(n)种跳法,第一次跳时有两种选择跳一级, * 此时跳法数等于后面n-1级台阶的跳法数目f(n-1),第一次跳 * 时跳两级,此时跳法数目等于后面n-2阶台阶的跳法数目f(n-2), * 有f(n) = f(n-1) + f(n-2),初...原创 2018-07-26 20:30:29 · 116 阅读 · 0 评论 -
014排序算法大全
/* * 排序算法总结 */#include &amp;amp;amp;amp;lt;iostream&amp;amp;amp;amp;gt;using namespace std;class solution{public: // 原始起泡排序 void bubble_sort_origin(int* arr, int n) { if (!arr || n &amp;amp;amp;amp;l原创 2018-07-26 20:31:47 · 253 阅读 · 0 评论 -
排序算法的稳定性
首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj, Ai原来在位置前,排序后Ai还是要在Aj位置前。 其次,说一下稳定性的好处。排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排序,逐次按高...原创 2018-07-26 21:45:07 · 178 阅读 · 0 评论 -
赋值运算符的异常安全
编写赋值运算符时不仅考虑自赋值和内存泄漏问题,还要考虑到异常安全,当给待赋值对象分配内存以存储资源时,要考虑可能因内存不足抛出异常,这时应该保证实例对象状态不被改变。class A{ /*...*/private: char* ps;};A& A::operator=(const A& rhs){ if (*this != rhs) { A t...原创 2018-07-22 12:26:50 · 297 阅读 · 0 评论 -
021二进制问题
// 二进制中1的个数//// 题目1:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如// 把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。//// 题目2:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数为奇数还是偶数。//// 题目1的思路1:注意移位运算中逻辑右移和算术右移的区别,所以不要对输入数进行右移// 操作,应该对标志...原创 2018-07-31 19:38:44 · 433 阅读 · 0 评论 -
010用两个栈实现队列
/* * 用两个栈实现队列 * * 题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail * 和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。 * * 思路:结点总是插入stack1,当stack2非空的时候,删除的元素总是stack2的顶部结点; * 当stack2为空,就将stack1元素相继弹出,然后按序压入stac...原创 2018-07-25 20:47:04 · 78 阅读 · 0 评论 -
009二叉树的下一个结点
/* * 二叉树的下一个结点 * * 题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? * 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。 * * 思路:情况1:如果该结点有右子树,则右子树中最左子节点为所求; * 情况2:如果无右子树,且是其父结点的左子节点,则父结点为所求; * 情况3:如果无右子树,且...原创 2018-07-23 22:16:44 · 95 阅读 · 0 评论 -
008重建二叉树
/* * 重建二叉树 * * 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输 * 入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1, * 2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2, 1, 5, 3, 8, 6},则重建出 * 二叉树并输出它的后序遍历序列。 * * 思路:前序序列中第一个值就是根节点的值,...原创 2018-07-23 20:54:20 · 88 阅读 · 0 评论 -
卡特兰数(Catalan)证明及应用:12个高矮不同的人排成前后两队
阿里巴巴笔试题,12个高矮不同的人排成两队...原创 2017-12-07 11:05:26 · 1545 阅读 · 0 评论 -
一些算法分析中的常用级数
1.幂方级数:比幂次高出一阶 幂次为1时也就是我们常说的算术级数。 证明: 2.几何级数:与末项同阶 3.调和级数、对数级数: 4.一些收敛级数: ...原创 2018-05-28 09:30:20 · 7830 阅读 · 0 评论 -
位运算及其实用技巧
位运算简介及实用技巧(一):基础篇 位运算简介及实用技巧(二):进阶篇(1) 位运算简介及实用技巧(三):进阶篇(2) 位运算简介及实用技巧(四):实战篇...转载 2018-07-02 11:32:16 · 201 阅读 · 0 评论 -
001找出数组中重复的数字
/** 找出数组中重复的数字** 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,* 也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},* 那么对应的输出是重复的数字2或者3。** 思路:扫描数组,位置i的值与i比较,相同跳过,不相同假设把...原创 2018-07-23 20:44:16 · 119 阅读 · 0 评论 -
002不修改数组找出其中重复的数字
/** 不修改数组找出其中重复的数字** 题目:在一个长度为n+1的数组里的所有数字都在1到n的范围内,所以数组中至* 少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的* 数组。例如,如果输入长度为8的数组{2, 3, 5, 4, 3, 2, 6, 7},那么对应的* 输出是重复的数字2或者3。** 思路:不用辅助空间。用中间值m将元素大小一分为二,遍历数组计...原创 2018-07-23 20:45:33 · 123 阅读 · 0 评论 -
003二维数组中的查找
/* * 二维数组中的查找 * 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按 * 照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个 * 整数,判断数组中是否含有该整数。 * 思路:在二维数组(维度p,q)组成的矩形中,每次取右上(或左下)角的数字m与待查找元素n比较, * 如果m > n,剔除最右一列元素,如果m < n,...原创 2018-07-23 20:46:25 · 99 阅读 · 0 评论 -
004替换空格
/* * 替换空格 * * 题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入“We are happy.”, * 则输出“We%20are%20happy.”。(假定原字符串长度足够,在原字符串上进行修改) * * 思路:先扫描一趟字符串,找出其中的空格数量,计算替换后的字符串长度,并且从后向前复制字符串, * 遇到空格就替换。为此需要准备两根指针,一根指向原字符...原创 2018-07-23 20:48:48 · 72 阅读 · 0 评论 -
005合并数组
/* * 合并数组 * * 题目:合并两个排序的整数数组A和B变成一个新的数组。 * 比如,给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6]。 * 注意,这里假设A有足够空间能够容得下B,并且数组A和B的初始元素个数分别为m和n。 * * 思路:先计算好复制后的元素数量,从后向前比较两数组元素,谁的元素较大,就复制到A,并递减...原创 2018-07-23 20:49:54 · 120 阅读 · 0 评论 -
006单链表的一些基本操作
/* * 单链表的一些基本操作 * 注意head是指向指针的指针 * ||||||||||||||||||||||| * 从尾到头打印链表 * * 题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。(不改变 * 链表的结构) * * 思路:在不改变链表结构的前提下,链表的遍历是顺序的,而输出是逆序的,自然想到 * 用栈结构来存储顺序遍历的值。还有种方法是递归,原理与...原创 2018-07-23 20:52:27 · 121 阅读 · 0 评论 -
007二叉树基本操作
/* * 二叉树基本操作(没有父节点指针) */#include <iostream>#include <stack>#include <queue>using namespace std;struct tree_node{ int data; tree_node* lc; tree_node* rc;};cl...原创 2018-07-23 20:53:33 · 90 阅读 · 0 评论 -
015旋转数组的最小数字
/* * 旋转数组的最小数字 * 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 * 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组 * {3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。 * * 思路:二分查找。一般情况,首元素&gt;=尾元素,用三个指针指向首元素、尾后元素、中间元素,中间元...原创 2018-07-27 21:35:51 · 95 阅读 · 0 评论