数据结构与算法学习笔记
本专栏主要是自己学习数据结构和算法的一些笔记,包括二叉树、链表、排序、查找等基本知识
酱油何在
渣硕一枚
展开
-
【剑指offer】-从尾到头打印链表
题目:输入一个链表,从尾到头打印链表每个节点的值。 解析:这道题目可以有很多种解法,下面介绍几种自己的解法。 1)利用栈的特性来做,把链表结点依次压入栈,再依次打印出来即可。 2)利用递归来做。 3)把链表反转,再从头到尾打印。 4)利用STL中的vector来做,把链表结点全部存入到vector中,再从后往前打印一遍vector中的数据。 需要注意的是,第一种方法和第四种方法需要申请原创 2015-11-02 22:01:44 · 842 阅读 · 0 评论 -
【剑指offer】-替换空格
题目:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 解析:如果从前往后替换字符串中的空格,则每次替换,都要把空格后的字符向后挪动相应的位置。这样,时间复杂度会很高。在此,我们可以换个思路,先计算出替换后的字符串长度,然后从字符串后面向前遍历,依次替换,这样就不需要重复挪动字符了。 代码原创 2015-11-02 15:04:09 · 2450 阅读 · 0 评论 -
【剑指offer】-二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。例如:下面的数组 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 则在原创 2015-10-31 11:04:48 · 613 阅读 · 0 评论 -
【算法学习笔记】-排序算法
排序算法常见的有:直接插入排序,归并排序,堆排序,快速排序和冒泡排序等。它们的性能如下表所示: 注:排序算法的稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。 比较重要的三种排序方法:快速排序、归并排序和原创 2015-08-25 16:54:04 · 893 阅读 · 0 评论 -
【算法学习笔记】-二分查找算法
二分搜索是一种常用的搜索方法,它要求数组中的元素必须是有序存放的。不失一般性,我们假定数组元素按升序存放。二分搜索方法首先将关键字与位于数组中央的元素进行比较,比较结果有三种情况: 1)如果关键字小于中央元素,我们只需要继续在数组的前半部分进行搜索。 2)如果关键字与中央元素相等,则搜索结束,找到匹配元素。 3)如果关键字大于中央元素,我们只需要继续在数组的后半部分进行搜索。 二分搜索的代原创 2015-08-25 17:28:07 · 1109 阅读 · 0 评论 -
【数据结构学习】-链表
链表是一种数据结构,当要保存和管理的数据元素的数目变化较大时,使用链表效率会很高。在链表中,每个元素都保存在一个称为节点的数据结构中。当新的元素加入列表时,创建新的节点来保存元素,链表中所有节点通过指针串联在一起。 对于一个链表,首先要掌握链表的基本操作,比如插入、删除、判断一个元素是否在链表中等等。以下是对链表进行基本操作的代码和解析。 #include using namespace s原创 2015-08-26 12:00:25 · 1187 阅读 · 0 评论 -
【数据结构学习】-二叉树的概念与遍历
链表、栈或队列都是线性结构,包含一个数据元素序列。而二叉树是一种层次结构。一颗二叉树要么为空,要么由一个数据元素(称为跟)和两颗独立的二叉树(称为左子树和右子树)。某个节点的左(右)子树的根节点称为该节点的左(右)孩子节点。两颗子树均为空的节点称为叶子节点。 搜索二叉树:其左子树任意节点的值都小于此节点的值,其右子树中任意节点的值都大于此节点的值。 完全二叉树:如果一颗二叉树除最后一层外都保证原创 2015-08-27 12:05:00 · 1126 阅读 · 0 评论 -
【数据结构学习】-堆与堆排序
堆是一种非常有用的数据结构,可用来设计高效的排序算法和优先队列。一个堆是一颗具有如下性质的二叉树:1)它是一颗完全二叉树;2)每个节点都大于等于其任何子节点。 如上图是一个最大堆,我们可以用数组来描述它。根节点在数组位置0,两个孩子在位置1和2。对于位于位置i的节点,其左孩子在2i+1,其右孩子在2i+2,其父节点在(i-1)/2。利用堆进行排序,是堆一个很重要的用途。下面是堆排序的代码原创 2015-08-27 16:30:28 · 1191 阅读 · 0 评论 -
【算法学习笔记】-动态规划
动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题(子问题的求解是递归进行的,将其划分为更小的子子问题)。在这种情况下,分治法会做许多不必要的工作,它会反复地求解那些公共子子问题。而动态规划算法对每个子子问题只求解一次,将其解保存在一个表格中,从而无需每次求解一个子子问题时都重新计算,避免了这种不必要的计算工作。 我们通常按如下4个步骤来设计一个动态规划算法: 1.刻画一个最优解原创 2015-09-11 18:44:07 · 1721 阅读 · 0 评论