数据结构和算法
文章平均质量分 69
猫小时候
最近在刷LeetCode,想把自己刷题的经历写下来,然后想多认识一些代码大神,也非常希望得到大家的意见。
展开
-
冒泡排序
1 C++代码/************************************************* Copyright: 武汉大学计算机学院B507 Author: RyanDate: 2015-11-05 Description: 冒泡排序 **************************************************/ #include<iost原创 2015-11-05 21:23:42 · 354 阅读 · 0 评论 -
二叉树——二叉树的遍历
二叉树遍历(Binary Tree Traversal) 二叉树的遍历是指按照一定次序访问树中所有结点,并且每个结点仅被访问一次的过程。它是最基本的运算,是二叉树中所有其他运算的基础。 重用的4种遍历方法如下: 1.前序遍历 前序遍历的二叉树的过程如下: (1)访问根结点 (2)前序遍历左子树 (3)前序遍历右子树 前序遍历二叉树的递归算法如下://前序遍历(递归原创 2016-02-21 12:29:52 · 846 阅读 · 0 评论 -
反转链表
题目名称 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。链表节点定义如下:描述 Given an array of integers, find two numbers such that they add up to a specific target number.The function twoSum should return indices of the tw原创 2016-02-21 20:54:15 · 196 阅读 · 0 评论 -
二叉树——根据二叉树遍历序列构造二叉树
根据前序序列和中序序列构造二叉树 二叉树的节点类型声明如下:struct BTNode { char val; BTNode *left; BTNode *right; BTNode(char c):val(c), left(NULL), right(NULL);};定理1 任何(n>=0)个不同节点的二叉树,都可由它的前序序列和中序序列唯一地确定。 根据前原创 2016-02-23 20:13:37 · 1491 阅读 · 0 评论 -
关于排序算法
排序算法一直是面试和算法学习的基础和重点,一直想找个时间总结一下,今天就开始吧,对于常见的排序算法一定要做到以下几点: 1. 一提到某个排序算法,要立马说出算法的思想和排序过程; 2. 一提到某个排序算法一定要立马能在纸上写出相应的排序代码; 3. 熟记各个排序算法的时间复杂度和空间复杂度; 4. 一定要记住各种排序算法的稳定性; 5. 各种排序算法的使用场合。原创 2016-03-21 15:52:35 · 474 阅读 · 0 评论 -
插入排序
插入排序的思想是:每一趟将一个待排序的元素,按其关键字值的大小插入到已经排序的部分文件中的适当位置上,直到全部插入完成。这里介绍三种插入排序方法:直接插入排序、折半插入排序和希尔排序。直接插入排序1.算法思想 直接插入排序的过程是将依次将每个元素插入到一个有序的序列中去。所有元素分为有序区和无序区,每次从无序区中拿出第一个元素,从后往前(下标递减)依次与有序区每个元素比较,找到正确的位置,并将原创 2016-03-21 17:16:48 · 585 阅读 · 0 评论 -
Binary Tree Postorder Traversal
题目名称 145.Binary Tree Postorder Traversal描述 Given a binary tree, return the postorder traversal of its nodes’ values.For example: Given binary tree {1,#,2,3}, 1 \ 2 / 3return [3,2,1原创 2016-02-24 22:14:26 · 357 阅读 · 0 评论 -
选择排序
选择排序的基本方法是:每步从带排序的元素中选出关键词最小(或最大)的元素,顺序放在已排序的元素的最后,直到全部排序完为止。这里介绍简单选择排序和堆排序。简单选择排序1.算法思想 每次从无序区中挑选出一个最小的值,将其与无序区的第一个元素交换,初始有序区为空,无序区包含所有待排序元素。2.性能分析 简单选择排序算法的效率与初始数据的顺序无关。3.完整代码#include<iostream>原创 2016-03-21 21:26:11 · 343 阅读 · 0 评论 -
Construct Binary Tree from Preorder and Inorder Traversal
题目名称 105. Construct Binary Tree from Preorder and Inorder Traversal描述 Given preorder and inorder traversal of a tree, construct the binary tree. 分析 详细分析过程见我的博客二叉树——根据二叉树遍历序列构造二叉树C++代码/** * Defin原创 2016-02-25 22:18:55 · 482 阅读 · 0 评论 -
Construct Binary Tree from Inorder and Postorder Traversal
题目名称 106. Construct Binary Tree from Inorder and Postorder Traversal描述 Given inorder and postorder traversal of a tree, construct the binary tree. 分析 这题同样是见我的博客二叉树——根据二叉树遍历序列构造二叉树C++代码/** * Defi原创 2016-02-25 22:21:32 · 381 阅读 · 0 评论 -
归并排序
首先,将R[0…n-1]看成是n个长度为1的有序表,将相邻的有序表成对归并,得到n/2个长度为2的有序表;然后,再将这些有序表成对归并,得到4/n个长度为4的有序表,如此反复进行下去,最后得到一个长度为n的有序。 由于归并是在相邻的两个有序表中进行的,因此,上述排序方法也叫二路归并排序。如果归并操作是在相邻的多个有序表中进行,则叫多路归并排序。这里只讨论二路归并排序。原创 2016-03-23 13:14:11 · 424 阅读 · 0 评论 -
交换排序
交换排序的基本方法是:两两比较待排序的关键字,并交换不满足次序要求的那些偶对,直到全部满足为止。这里介绍冒泡排序和快速排序两种交换排序方法。冒泡排序1.算法思想 通过无序区中相邻关键字间的比较和位置交换,使关键字最小的元素如气泡一般逐渐网上“漂浮”直至“水面”。 整个算法是从最下面的元素开始,对每两个相邻元素的关键字进行比较,且使关键字较小的元素换至关键字较大的元素之上,使得经过一趟冒泡原创 2016-03-22 10:36:10 · 781 阅读 · 0 评论 -
C++ 图的遍历
图的基础知识大家都能搜到,只是最近我在找图算法时看到的C++代码都是很旧之前的版本了,所以这里用了STL来重新写了一遍。图的邻接表存储结构的类型声明//边结点结构类型 struct ANode { int adjvex; //边的终点位置 ANode* nextarc; //指向表头结点下一条邻接的边 int info; //该边的相关信息,对于带权原创 2016-02-28 18:46:36 · 7490 阅读 · 1 评论 -
二叉树——基本概念
二叉树(Binary Tree)1.二叉树的定义 二叉树的定义是以递归形式给出的: 一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。 二叉树有5种基本形态,如图1所示,任何复杂的二叉树都是这5种基本形态的复合,其中图(a)是空二叉树,图(b)是单结点的二叉树,图(c)是右子树为空的二叉树,图(d)是左子树为空原创 2016-02-21 11:02:37 · 903 阅读 · 0 评论 -
用C++实现bitmap
位图数据结构 该数据结构描述了一个有限定义域内的稠密集合,其中的每一个元素最多出现一次并且没有其他任何数据与该元素相关联。即使这些条件没有完全满足(例如,存在重复元素或额外的数据),也可以用有限定义域内的键作为一个表项更复杂的表格索引。1.什么是bitmap? 所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在原创 2016-03-16 22:10:10 · 9037 阅读 · 0 评论 -
链表中倒数第K个节点
题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 分析:为了得到倒数第k个结点,很自然的想法是先走到链表的尾端,再从尾端回溯k步。可是输入的是单向链表,只有从前往后的指针而没有从后往前的指针。转载 2015-10-04 15:14:45 · 714 阅读 · 0 评论 -
Insertion Sort List
题目名称 Insertion Sort List—LeetCode链接描述 Sort a linked list using insertion sort.分析 写一个单链表的插入排序算法。给大家推荐一个非常好的学习数据结构的网站Visual Algorithm。C++代码/** * Definition for singly-linked list. * struct ListNod原创 2015-11-05 21:07:41 · 358 阅读 · 0 评论 -
选择排序
1 c++代码#include<iostream>#include<vector>#include<algorithm>using namespace std;void select(vector<int> &nums){ for(int i=0;i<nums.size()-1;i++) { //pos总是定位到未排序部分的最小值 int pos=i;原创 2015-11-05 22:01:55 · 289 阅读 · 0 评论 -
插入排序
1 c++代码/************************************************* Copyright: 武汉大学计算机学院B507 Author: RyanDate: 2015-11-06 Description: 插入排序 **************************************************/ #include<iost原创 2015-11-06 14:23:09 · 368 阅读 · 0 评论 -
H-Index II
题目名称 H-Index II—这里写链接内容描述 Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimize your algorithm?分析 这里给的是一个已经排序的数组,如果用之前在H-Index中的算法效率非常低,所以我想到用二分搜索来查找。原创 2015-11-09 12:42:06 · 444 阅读 · 0 评论 -
Search for a Range
题目名称 Search for a Range—这里写链接内容描述 Given a sorted array of integers, find the starting and ending position of a given target value.Your algorithm’s runtime complexity must be in the order of O(log n).原创 2015-11-09 12:44:59 · 375 阅读 · 0 评论 -
Catalan数—求解n个节点能组成的二叉树个数问题
1.catalan简介 卡塔兰数是组合数学中一个常在各种计数问题中出现的数列。以比利时的数学家欧仁·查理·卡塔兰(1814–1894)命名。历史上,清代数学家明安图(1692年-1763年)在其《割圜密率捷法》最早用到“卡塔兰数”,远远早于卡塔兰。有中国学者建议将此数命名为“明安图数”或“明安图-卡塔兰数”。卡塔兰数的一般公式为 C(n,2n)/(n+1)。2.性质 令h(0)=1,h(1)=1原创 2015-10-26 09:57:39 · 5996 阅读 · 1 评论 -
回溯法概述—BackTracking
1.问题的解空间 复杂问题常常有很多的可能解,这些可能解构成了问题的解空间。解空间也就是进行穷举的搜索空间,所以,解空间中应该包括所有的可能解。确定正确的解空间很重要,如果没有确定正确的解空间就开始搜索,可能会增加很多重复解,或者根本就搜索不到正确的解。 对于任何一个问题,可能解的表示方式和它相应的解释隐含了解空间及其大小。 例如,对于有n个物品的0/1背包问题,其可能解的表示方式可以有以原创 2015-11-18 15:55:52 · 1468 阅读 · 0 评论 -
Combinations
题目名称 Merge Sorted Array—LeetCode链接描述 Given two integers n and k, return all possible combinations of k numbers out of 1 … n.For example, If n = 4 and k = 2, a solution is:[ [2,4], [3,4], [2,3]原创 2015-11-19 10:17:40 · 399 阅读 · 0 评论 -
Permutations—回溯法求解
题目详细信息请参考我之前写的方法Permutations分析 让每个元素都能成为某种排序的第一个元素。C++代码#include<iostream>#include<vector>#include<algorithm>using namespace std;void permutation(vector<int> &num, int begin, vector<vector<int> >原创 2015-11-19 15:35:15 · 815 阅读 · 0 评论 -
算法虐我千百遍,我待算法如初恋
算法虐我千百遍,我待算法如初恋。学习方法 1) 把所有经典算法写一遍 2) 看算法源码 3) 加入算法学习社区,相互鼓励学习 4) 看经典书籍基本数据结构和算法 这些算法全部自己敲一遍:二叉树 二叉树 二叉查找树 Trie树(前缀树) 后缀树 最优二叉树(赫夫曼树) 伸展树(splay tree 分裂树) 平衡二叉树AVL 红黑树 B树(B-),B+,B* R树二叉堆转载 2015-11-21 14:34:36 · 1029 阅读 · 0 评论 -
Combination Sum
题目名称 Combination Sum—LeetCode链接描述 Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.The same repeated number may be原创 2015-11-19 15:06:52 · 353 阅读 · 0 评论 -
Number of Islands
题目名称 200. Number of Islands描述 Given a 2d grid map of ‘1’s (land) and ‘0’s (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontall原创 2016-02-29 15:18:20 · 486 阅读 · 0 评论