数据结构和算法
wxplol
这个作者很懒,什么都没留下…
展开
-
【算法系列(七)】:回溯
解决一个回溯问题,实际上就是一个决策树的遍历过程。你只需要思考 3 个问题:1、路径:也就是已经做出的选择。2、选择列表:也就是你当前可以做的选择。3、结束条件:也就是到达决策树底层,无法再做选择的条件。...原创 2020-09-15 10:38:54 · 319 阅读 · 0 评论 -
【算法系列(六)】:字典
字典是通过 Key/Value (键值对) 的形式来存放数据;该类最大的优点就是它查找元素的时间复杂度接近 O(1),实际项目中常被用来做一些数据的本地缓存,提升整体效率。原创 2020-09-09 11:54:12 · 628 阅读 · 0 评论 -
【算法系列(五)】:集合
集合技术在解题中主要用于处理有数据重复出现的问题。这里直接看leetcode题库的实例来感受下吧。。。一、算法应用349. 两个数组的交集题目描述给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[9,4]解题思路直接利用集合这种结构c++代码实现vector<int> i原创 2020-09-08 09:53:58 · 340 阅读 · 0 评论 -
【算法系列(四)】:双指针
一般双指针算法主要分为两类:(1)快慢指针(2)左右指针。前者解决主要解决链表中的问题,比如典型的判定链表中是否包含环;后者主要解决数组(或者字符串)中的问题,比如二分查找。快慢指针:快慢指针一般都初始化指向链表的头结点 head,前进时快指针 fast 在前,慢指针 slow 在后,巧妙解决一些链表中的问题。 左右指针:左右指针在数组中实际是指两个索引值,一般初始化为左指针指向数组首地址,尾指针指向数组尾部。另外,左右指针的另一种进阶用法叫做滑动窗口算法。这是双指针技巧的最高境界了,此类算法主要.原创 2020-09-07 16:06:42 · 256 阅读 · 0 评论 -
【算法系列(三)】:查找
一、查找表考虑的基本数据结构,主要分为以下几种情况:第一类: 查找有无--set例如:元素'a'是否存在,通常用set:集合。set只存储键,而不需要对应其相应的值。set中的键不允许重复。第二类: 查找对应关系(键值对应)--dict元素'a'出现了几次:dict-->字典。dict中的键不允许重复。第三类: 改变映射关系--map通过将原有序列的关系映射统一表示为其他1.1、算法应用349. 两个数组的交集 题目描述 给定两个数组nums,求两个数组的公共元原创 2020-08-26 07:28:39 · 237 阅读 · 0 评论 -
【算法系列(二)】:动态规划
一、基本思想动态规划(英语:Dynamic programming,简称 DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。动态规划往往用于优化递归问题,例如斐波那契数列,如果运用递归的方式来求解会原创 2020-08-22 18:19:19 · 328 阅读 · 0 评论 -
【算法系列(一)】:分治
主要思想:分治算法的主要思想是将原问题递归地分成若干个子问题,直到子问题满足边界条件,停止递归。将子问题逐个击破(一般是同种方法),将已经解决的子问题合并,最后,算法会层层合并得到原问题的答案。分治算法的步骤:分:递归地将问题分解为各个的子问题(性质相同的、相互独立的子问题);治:将这些规模更小的子问题逐个击破;合:将已解决的子问题逐层合并,最终得出原问题的解;分治法适用的情况:*原问题的计算复杂度随着问题的规模的增加而增加。*原问题..原创 2020-08-18 20:35:36 · 1461 阅读 · 0 评论 -
【二叉树(二)】:二叉搜索树
1、定义二叉搜索树是一种节点值之间具有一定数量级次序的二叉树,对于树中每个节点:二叉搜索树是以一棵二叉树来组织,每个节点就是一个对象,包括key、卫星数据,除此之外还包括一些为了维持树结构所需要的信息:left、right、parent,分别指向左孩子、右孩子、父节点。其中如果孩子节点或者父节点不存在时,用NULL表示。根节点是树中唯一一个父节点为NULL的节点。性质:每个元素都有一...原创 2019-11-06 11:27:37 · 394 阅读 · 0 评论 -
【二叉树(一)】:二叉树简单实现
二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。1、树的相关概念1.1、树树是一种一对多的数据结构。树又有很多子集,比如:二叉树、二叉搜索树、2-3树、红黑树等等。树的特征:1.没有父结点的结点叫根,一个...原创 2019-10-29 10:12:00 · 1587 阅读 · 0 评论 -
【散列表】:散列
散列表又称哈希表,查找只需要花费常数时间,查找效率极高,对庞大数据的查找很有作用。散列的基本思想:理想的散列表数据结构只不过是一个包含一些项的具有固定大小的数组。(表的大小一般为素数)设该数组的大小为TbaleSize,我们向该散列表中插入数据,首先我们将该数据用一个函数(散列函数)映射一个数值x(位于0到TbaleSize1-1之间);然后将该数据插入到散列表的第x的单元。(如果有多个数据...原创 2019-10-15 17:14:24 · 266 阅读 · 0 评论 -
【线性表(三)】:队列之循环队列
一、循环队列的实现template <class T>class CyclicQueue:public Queue<T>{public: CyclicQueue():capacity_(10), ptr_(shared_ptr<T>(new T[capacity_],[](T *p){delete[] p;...原创 2019-10-10 15:00:50 · 167 阅读 · 0 评论 -
【线性表(三)】:队列之普通队列
一、定义队列的基类template <class T>class Queue{public: virtual ~Queue(){} //队列是否为空 virtual bool empty() = 0; //队列的大小 virtual size_t size() =0; //返回队首元素 virtual T fron...原创 2019-10-10 14:59:20 · 167 阅读 · 0 评论 -
【线性表(一)】:链表之单链表
一、定义节点//链表节点template <class T>class ListNode{public: ListNode():value_(NULL),front(nullptr),next(nullptr){} ListNode(const T &value):value_(value),front(nullptr),next(nullptr)...原创 2019-09-26 11:51:56 · 172 阅读 · 0 评论 -
【线性表(一)】:链表之双向链表
二、双向链表的实现template <class T>class DulList{public: DulList():head_(nullptr),size_(0){} ~DulList(); //获取链表大小 size_t size(){return size_;} //判断链表是否为空 bool em...原创 2019-10-08 10:15:29 · 157 阅读 · 0 评论 -
【线性表(一)】:链表之单向循环链表
三、单向循环链表的实现template <class T>class CycSingleList{public: CycSingleList():head_(nullptr),size_(0){} ~CycSingleList(); //链表大小 size_t size(){return size_;} //链表是否为空 bo...原创 2019-10-08 14:23:15 · 141 阅读 · 0 评论 -
【线性表(一)】:链表之双向循环链表
四、双向循环链表的实现template <class T>class CycDulList{public: CycDulList():head_(nullptr),size_(0){} ~CycDulList(); //获取链表大小 size_t size(){return size_;} //判断链表是否为空 bool em...原创 2019-10-08 14:40:49 · 188 阅读 · 0 评论 -
【线性表(一)】:链表之静态链表
五、静态链表的实现//定义静态节点template <class T>class StaticListNode{public: T value_; int next; //指向下一个节点的游标};template <class T>class StaticList{public: StaticList(const...原创 2019-10-09 17:22:35 · 111 阅读 · 0 评论 -
【线性表(二)】:栈之顺序栈
一、定义栈的基类//栈的基类template <class T>class Stack{public: virtual ~Stack(){} //判断栈是否为空 virtual bool empty() = 0; //栈中元素的大小 virtual size_t size() = 0; //获取栈顶元素 virtua...原创 2019-10-10 14:27:49 · 99 阅读 · 0 评论 -
【线性表(二)】:栈之链式栈
一、链式栈的实现这里我们需要用到之前实现的单链表,如果不知道,可以参考我的前一篇文章:【线性表(一)】:链表之单链表。template <class T>class ListStack:public Stack<T>, public SingleList<T>{public: ListStack():top...原创 2019-10-10 14:34:35 · 111 阅读 · 0 评论