
数据结构和算法
子非鱼_cw
这个作者很懒,什么都没留下…
展开
-
跳台阶(斐波那契数列)
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。(类似于斐波那契数列)采用递归方法求解,时间复杂度为O(2^n).class Solution {public: int jumpFloor(int number) { if(number==1||number==2) return number;原创 2016-06-28 20:53:42 · 442 阅读 · 0 评论 -
迷宫问题、最短路(BFS,DFS)
#include #include using namespace std;const int N = 100;char map[N][N];bool vis[N][N] = {0}; //访问记录int path[N][N]; //记录路径 0、1、2、3分别代表上下左右int fx[4] = {-1,1,0,0}; //上下左右移动int fy[4] = {0,原创 2017-08-02 15:42:50 · 3203 阅读 · 0 评论 -
把排序数组转化为高度最小的二叉树
把排序数组转换为高度最小的二叉搜索树思路:直接采用中间值来作为二叉树的根节点;将原数组分成左右均等或者相差一个数的两个新数组;然后递归的对这两个新数组进行相同的处理,这样对于每一个根节点,其左右子树的高度相差绝对值不会超过1,也就是满足了二叉平衡树的要求了。struct TreeNode { int val; TreeNode* left; TreeNode* right; Tre原创 2017-06-20 20:24:19 · 830 阅读 · 0 评论 -
各种排序算法的对比与C++实现
排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。一、冒泡排序基本思想:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程原创 2017-06-09 11:13:33 · 714 阅读 · 0 评论 -
约瑟夫环问题的数学求解
原文 http://www.cnblogs.com/jjscm/p/4463555.html问题:有n个人站成环 从1开始报数,报k的人去死,之后下一个人报1,问当你是第几个的时候可以活下来?这篇文章主要是讲解 f(n,k)=(f(n-1,k)+k)%n 这个公式是什么意思为什么是对的 虽然公式是使用数学解法 但开始时我会手动的模拟过程 其是有意义的 十转载 2016-10-06 16:16:12 · 713 阅读 · 0 评论 -
暗黑的字符串
一个只包含'A'、'B'和'C'的字符串,如果存在某一段长度为3的连续子串中恰好'A'、'B'和'C'各有一个,那么这个字符串就是纯净的,否则这个字符串就是暗黑的。例如:BAACAACCBAAA 连续子串"CBA"中包含了'A','B','C'各一个,所以是纯净的字符串AABBCCAABB 不存在一个长度为3的连续子串包含'A','B','C',所以是暗黑的字符串你的任务就是计算出长度转载 2016-10-05 18:25:32 · 562 阅读 · 0 评论 -
跳石板问题(约数)
小易来到了一条石板路前,每块石板上从1挨着编号为:1、2、3.......这条石板路要根据特殊的规则才能前进:对于小易当前所在的编号为K的 石板,小易单次只能往前跳K的一个约数(不含1和K)步,即跳到K+X(X为K的一个非1和本身的约数)的位置。 小易当前处在编号为N的石板,他想跳到编号恰好为M的石板去,小易想知道最少需要跳跃几次可以到达。例如:N = 4,M = 24:4->6-原创 2016-10-05 16:52:24 · 2633 阅读 · 0 评论 -
构造回文序列
如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。现在给出一个数字序列,允许使用一种转换操作:选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之原创 2016-10-04 16:22:18 · 4609 阅读 · 2 评论 -
最大公共子序列(删除字符使得剩下的是回文串)
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?输出需要删除的字符个数。思路:采用常规方法复杂度太大,应该采用动态规划的思想。求原字符串和其反串的最大公共子序列(不是子串,因为可以不连续)的长度(使用动态规划),然后用原字符串的长度减去这个最大公共子串的长度就得到了最小删除的字符个数。状态:当str1的下标为m,str2原创 2016-10-10 22:48:18 · 1106 阅读 · 0 评论 -
二叉树打印成多行
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/原创 2016-08-03 21:42:41 · 652 阅读 · 0 评论 -
顺序存储结构线性表的各项操作
#include<iostream>#define MAXSIZE 20#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0using namespace std;typedef int ElemType;typedef int Status;typedef struct { ElemType data[MAXSIZE原创 2016-05-13 16:52:06 · 373 阅读 · 0 评论 -
单链表的各项操作
#include<iostream>#include<time.h>#define MAXSIZE 20#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0using namespace std;typedef int ElemType;typedef int Status;typedef struct Node {原创 2016-05-14 09:32:41 · 318 阅读 · 0 评论 -
二叉树的遍历与创建
#include<iostream>#define MAX_TREE_SIZE 100typedef char TElemType;//二叉树的结构链表结点结构的定义typedef struct BiTNode { //结点结构 TElemType data; struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;//二叉树的前序遍原创 2016-05-17 16:59:00 · 327 阅读 · 0 评论 -
图的创建与遍历
图的存储结构可以用邻接矩阵或者邻接表来表示,对于n个顶点和e条边的无向网图,采用邻接矩阵创建时,其时间复杂度为O(n+n^2+e),深度优先算法遍历时间复杂度为O(n^2);采用邻接表创建时,其时间复杂度为O(n+e),深度优先算法遍历时间复杂度为O(n+e)。以下是两种方式的代码实现。#include<iostream>#define INF 65535#define MAXVEX 100原创 2016-05-18 21:10:41 · 4067 阅读 · 0 评论 -
Dijkstra算法
Dijkstra算法使用了贪心策略,解决了从某个源点到其余各顶点的最短路径问题,其时间复杂度为O(n^2).typedef int Pathmatrix[MAXVEX]; //用于存储最短路径下标的数组typedef int ShortPathTable[MAXVEX]; //用于存储各点最短路径的权值和//Dijkstra算法,求有向网G的V0顶点到其余顶点V的最短路径P[V]及带权长度D[V原创 2016-05-19 15:27:29 · 520 阅读 · 0 评论 -
剑指offer重点复习题目
题目:二叉搜索树与双向链表输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), ri原创 2017-08-03 15:51:26 · 853 阅读 · 0 评论