数据结构/算法
文章平均质量分 64
芳草源
路漫漫其修远兮,吾将上下而求索
展开
-
重温《大话数据结构》笔记一 单链表链式存储结构的操作代码
#include #include using namespace std;typedef int ElemType;//单链表的链式存储结构typedef struct Node{ ElemType data; //数据域 Node *next; //指针域}Node;typedef Node* LinkList;//线性表的类型操作(operation)void原创 2015-07-03 16:55:13 · 549 阅读 · 0 评论 -
二叉树的深度
一般二叉树的算法很容易地想到使用递归。在求一棵二叉树的深度时,我们判断根结点,如果根节点存在,则可以将问题转换成:求该根节点的左右子树中深度较大者+1。 代码如下:class Solution {public: int TreeDepth(TreeNode* pRoot) { int leftDepth, rightDepth; if(pRoot原创 2015-09-15 20:23:10 · 690 阅读 · 0 评论 -
经典排序算法之直接插入排序
插入排序的过程与我们平时抓牌的过程非常类似。每次抓一张排,然后与手上已有的牌逐个进行比较,找到其合适的插入位置。一、直观插入排序算法完全按照直接插入排序算法来编写代码,需要另外开辟一个与原数据相同的存储空间。将这个过程量化:假设有原序列有n个数据元素。第一个元素无序插入,因此需要插入n-1次。每次插入过程中,从后往前,遇到比自己大的就将此大的原创 2015-08-06 20:35:13 · 901 阅读 · 0 评论 -
经典排序算法之冒泡排序
冒泡排序,顾名思义,就是想冒泡一样,较大的泡泡或者较小的泡泡会往某个方向移动,直到所有的泡泡有序为止。一、简单排序实现在给出正宗的冒泡排序之前,我们来看一种简单的冒泡排序(以升序为例)。假定一定一个无序序列,从第一个位置开始,将此位置的元素与后面所有无序的元素逐个进行比较,只要是比这个位置的元素值小的元素,就与这个位置的元素互换值,直到序列末尾。因此,我们可以确定这个位置的原创 2015-08-06 18:24:41 · 928 阅读 · 0 评论 -
经典排序算法之简单选择排序
前面在介绍冒泡排序的时候,有提到一种简单排序算法,就是从0开始,每次确定一个位置的元素。假设当前需要确定的位置下标为i,则将i处的元素与后面的元素逐个比较,并将每次比较结果中较小的元素存放在i处,从而保证i处一直保存着最小元素。简单的选择排序算法与这种算法思路一样,但是选择排序在比较的过程中,并没有将比较结果存放在i处,而是保存每次比较结果中较小元素的下标到min中,从而保证m原创 2015-08-06 19:19:51 · 18981 阅读 · 1 评论 -
动态规划之最长不下降子序列
动态规划的思想就是需要在求得最优解的过程中保存中间结果。在求最长不下降子序列的过程中,我们需要保存每个子序列,然后继续往后判断时将当前元素添加到小于该元素并且最长的子序列当中。譬如有序列2、1、3,首先有一个序列2;然后判断1的时候,前面没有比1小的子序列,因此1独自成为一个序列;最后在判断3的时候,前面的两个子序列2和1都比3小,并且这两个子序列的长度也相等,这个时候两个都满足了,我们暂且就保存一原创 2015-08-31 08:46:47 · 5319 阅读 · 0 评论 -
动态规划之合唱队形问题(最长递增子序列变形)
题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形。合唱队形定义:设K位同学从左到右依次编号为1, 2, …, K,他们的身高分别为T1, T2, …, TK,则他们的身高满足T1 < T2 < … < Ti, Ti > Ti+1 > … > TK (1 <= i <= K)。 要求:已知所有N位同学的身高,计算最少需要几位同学出原创 2015-08-30 20:08:02 · 7049 阅读 · 0 评论 -
Maxinum Subarray
题目描述:Find the contiguous subarray within an array (containing at least one number) which has the largest sum. 输入:the array([−2,1,−3,4,−1,2,1,−5,4]) 输出: the largest sum(6) PS. for the array [4,−1,2,原创 2015-08-30 21:42:17 · 571 阅读 · 0 评论 -
经典排序算法之快速排序
快速排序的基本思想是,从带排序的序列中选取一个关键字作为基数,然后经过一轮排序,将比基数大的关键字放置在左侧,将比基数小的关键字放置在右侧。然后再两侧的中间便是此基数的位置,然后再将此基数的两边继续进行快速排序。从上面可以得知,每一趟快速排序都能够确定一个关键字的位置。对于每一趟的关键字与基数的比较以及移位,我们的方法如下:最后当low和high原创 2015-08-14 21:44:26 · 697 阅读 · 0 评论 -
动态规划之矩阵连乘问题
在动态规划算法中,局部最优并不一定会使得全局最优,它在每一个阶段的决策都会影响到后面的决策。所以我们在将问题划分为若干阶段时,需要将各个阶段所发生的不同状态存储起来,提供后一阶段做决策。一般都是子问题重叠的时候使用动态规划。下面是一个矩阵连乘的问题。问题:n个矩阵连乘问题描述:矩阵连乘满足结合律,在n个矩阵连乘时,什么样的结合方式可以使得整个过程中所做的乘法次数最小。数量化:记 Mi原创 2015-08-10 11:23:11 · 1209 阅读 · 0 评论 -
经典排序算法之堆排序
首先介绍堆的定义:堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。由于堆的表象结构是一棵完全二叉树,我们称之为二叉堆。下面分别就是两个大顶堆和小顶堆:随后我们都是以大顶堆为例来介绍堆排序的,小顶堆也是一样的。对于大顶堆,我们直到,根结点肯定是整个堆中最大的结点,原创 2015-08-07 18:01:41 · 679 阅读 · 0 评论 -
经典排序算法之希尔排序
前面的直接插入算法,以抓牌为例,假设手气比较好,抓牌的顺序是从A直到K,那么在这整个过程中都无需进行任何的插入动作,只需要将每次抓到的牌放在最后即可。假设现在手上已经抓到的牌的顺序中逆序比较少,则抓牌的过程中插入操作就越少。因此,对于基本有序的序列排序,直接插入排序的性能是比较好的。这里的基本有序是指较大的数据尽量在后面,而较小的数据尽量在前面。为了使得直接插入算法更加有效,我们可以在最后使用插入原创 2015-08-07 15:34:15 · 779 阅读 · 0 评论 -
2015华为机试题
一般二叉树的算法很容易地想到使用递归。在求一棵二叉树的深度时,我们判断根结点,如果根节点存在,则可以将问题转换成:求该根节点的左右子树中深度较大者+1。 代码如下:class Solution {public: int TreeDepth(TreeNode* pRoot) { int leftDepth, rightDepth; if(pRoot原创 2015-09-13 11:32:31 · 1127 阅读 · 0 评论