数据结构
文章平均质量分 55
Ashley zhao
意外和明天不知道哪个先降临?往者不可谏,来者犹可追
展开
-
NC45 二叉树先序,中序和后序遍历
描述给定一棵二叉树,分别按照二叉树先序,中序和后序打印所有的节点。要求:空间复杂度O(n),时间复杂度O(n)示例1输入:{1,2,3}返回值:[[1,2,3],[2,1,3],[2,3,1]]说明:示例2输入:{}返回值:[[],[],[]]方法一:递归解析:二叉树的先序遍历:先访问根结点,再访问左子树,最后访问右子树;二叉树的中序遍历:先访问左子树,再访问根结点,最后访问右子树;二叉树的后序遍历:先访问左子树,再访问右子树,最后访问根结点;/** * struct翻译 2022-03-30 16:49:01 · 204 阅读 · 0 评论 -
BM18 二维数组中的查找
描述在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]给定 target = 7,返回 true。给定 target = 3,返回 false。进阶:空间复杂度O(1) ,时间复杂度O(n+m)示例1输入:7,[[1,2,8,9],[2,4,9原创 2022-03-30 15:35:07 · 78 阅读 · 0 评论 -
BM17 二分查找
描述请实现无重复数字的升序数组的二分查找给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1进阶:时间复杂度O(logn) ,空间复杂度O(1)示例1输入:[-1,0,34,6,10,13,14],13返回值:6说明:13 出现在nums中并且下标为 6示例2输入:[],3返回值:-1说明:nums为空,返回-1示例3输入:[-1,0,3,4,6,原创 2022-03-30 15:28:26 · 282 阅读 · 0 评论 -
动态规划详解
以下为最常见的使用动态规划的例子:一、动态规划的三大步骤动态规划,无非就是利用历史记录,来避免我们的重复计算。而这些历史记录,我们得需要一些变量来保存,一般是用一维数组或者二维数组来保存。下面我们先来讲下做动态规划题很重要的三个步骤:第一步骤:定义数组元素的含义,上面说了,我们会用一个数组,来保存历史数组,假设用一维数组 dp[] 吧。这个时候有一个非常非常重要的点,就是规定你这个数组元素的含义,例如你的 dp[i] 是代表什么意思?第二步骤:找出数组元素之间的关系式,我觉得动态规划,还是有一点类翻译 2022-03-23 15:16:56 · 24501 阅读 · 15 评论 -
BM6 带环单链-判断链表中是否有环
给定一个链表:1. 判断链表是否有环。2. 如果链表有环,请找出环入口。3. 计算环的大小。快慢指针定义一个快指针fast和慢指针slow,快指针一次走两步,慢指针一次走一步。如果链表没有环,那么fast最终会指向nullptr;如果链表有环,那么快指针和慢指针最终会相遇。所以,如果最终fast == NULL,那么判断链表无环;如果最终fast == slow,且fast != nullptr,那么链表有环。第一步:快慢指针从头结点出发。如下图所示。蓝色表示快指针fast,红色表示慢指针sl原创 2022-03-22 21:37:00 · 89 阅读 · 0 评论 -
NC66 两个链表的第一个公共结点
描述输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)要求:空间复杂度O(1),时间复杂度O(n)例如,输入{1,2,3},{4,5},{6,7}时,两个无环的单向链表的结构如下图所示:可以看到它们的第一个公共结点的结点值为6,所以返回结点值为6的结点。输入描述:输入分为是3段,第一段是第一个链表的非公共部分,第二段是第二个链表的非公共部分,第三段是第一个链表和第二个链表的公共部翻译 2022-03-22 21:29:33 · 112 阅读 · 0 评论 -
NC78 反转链表
描述给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。数据范围: 0≤n≤1000要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。以上转换过程如下图所示:示例1输入:{1,2,3}返回值:{3,2,1}示例2输入:{}返回值:{}说明:空链表则输出空/*struct ListNode {翻译 2022-03-22 17:26:19 · 87 阅读 · 0 评论 -
剑指offer3:(反向链表)从尾到头打印链表
描述输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。如输入{1,2,3}的链表如下图:返回一个数组为[3,2,1]0 <= 链表长度 <= 10000示例1输入:{1,2,3}返回值:[3,2,1]示例2输入:{67,0,24,58}返回值:[58,24,0,67]题解:/*** struct ListNode {* int val;* struct ListNode *next;* List原创 2021-09-24 15:36:18 · 111 阅读 · 0 评论 -
NC33 合并两个排序的链表
描述输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:或输入{-1,2,4},{1,3,4}时,合并后的链表为{-1,1,2,3,4,4},所以对应的输出为{-1,1,2,3,4,4},转换过程如下图所示:示例1输入:{1,3,5},{2,4,6翻译 2022-03-22 17:58:35 · 88 阅读 · 0 评论 -
Leecode24:两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:输入:head = [1,2,3,4]输出:[2,1,4,3]示例 2:输入:head = []输出:[]示例 3:输入:head = [1]输出:[1]提示:链表中节点的数目在范围 [0, 100] 内0 <= Node.val <= 100方法一:递归思路与算法1.可以通过递归的方式实现两两交换链表中的节点。2.递归的终止条件是翻译 2021-10-12 11:25:17 · 89 阅读 · 0 评论 -
Leecode19:删除链表的倒数第 N 个结点
给一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2:输入:head = [1], n = 1输出:[]示例 3:输入:head = [1,2], n = 1输出:[1]提示:链表中结点的数目为 sz1 <= sz <= 300 <= Node.val <= 1001 <= n <= sz解题:方法一:计算链表长度一种容易想到的原创 2021-10-11 16:15:50 · 167 阅读 · 0 评论 -
华为机试51:输出单向链表中倒数第k个结点
描述:输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第1个结点为链表的尾指针。链表结点定义如下:struct ListNode{int m_nKey;ListNode* m_pNext;};正常返回倒数第k个结点指针,异常返回空指针本题有多组样例输入。输入描述:1.输入链表结点个数2.输入链表的值3.输入k的值输出描述:输出一个整数示例1输入:81 2 3 4 5 6 7 84输出:5#include<iostream>using names原创 2021-10-11 14:31:40 · 175 阅读 · 0 评论 -
NC88 寻找第K大
描述有一个整数数组,请你根据快速排序的思路,找出数组中第 k 大的数。给定一个整数数组 a ,同时给定它的大小n和要找的 k ,请返回第 k 大的数(包括重复的元素,不用去重),保证答案存在。要求:时间复杂度O(nlogn),空间复杂度 O(1)示例1输入:[1,3,5,2,2],5,3返回值:2示例2输入:[10,10,9,9,8,7,5,6,4,3,4,2],12,3返回值:9说明:去重后的第3大是8,但本题要求包含重复的元素,不用去重,所以输出9#include<strin翻译 2022-03-22 18:57:41 · 104 阅读 · 0 评论 -
利用冒泡排序法,对任意数组进行排序;
利用冒泡排序法,对任意数组进行排序;define _CRT_SECURE_NO_WARNINGSinclude include include原创 2016-10-25 20:32:42 · 2555 阅读 · 0 评论 -
链表的动态实现
对于链表我也不是很熟,以下是我自己用C++类写的关于链表的内容: 单链表:是一种简单的线性表的链式存储链表,每个数据元素用一个结点来存储,一个结点由两个域组成,(值域:)一个存放数据元素,(指针域:)一个存放指向下一个结点的指针; 以下是无头单链表的图形表示; 链表结点的结构:typedef int DataType;typedef struct strNode{ strNod原创 2017-04-17 19:20:40 · 303 阅读 · 0 评论 -
单链表的基本操作
1)list.hinclude < stdio.h>include < stdlib.h>include < assert.h>include < windows.h>include < malloc.h>typedef int DataType; typedef struct strNode { DataType _data; struct strNode *next; }原创 2017-03-31 20:00:44 · 428 阅读 · 0 评论 -
顺序表和链表的比较和区别
一.顺序表和链表的比较1)顺序表:顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且顺序表的存储空间需要预先分配。 它的优点是: a) 方法简单,各种高级语言中都有数组,容易实现。 b) 不用为表示节点间的逻辑关系而增加额外的存储开销。 c) 顺序表具有按元素序号随机访问的特点。 缺点: a) 在顺序表中做插入、删除操作时,平均移动表中的一半元素,因此n较大的顺序表效率原创 2017-04-03 11:56:55 · 18565 阅读 · 0 评论 -
二叉树的递归基本操作
二叉树的定义:二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2的 i -1次方个结点;深度为k的二叉树至多有2^(k) -1个结点;对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为n2,则n0 = n2 + 1。 二叉树的操作有树的创建、销毁、在树中查找某个结点、树的遍历等操作;以下是二叉树的基本操作原创 2017-05-29 13:42:13 · 503 阅读 · 0 评论 -
二叉树的操作--递归与非递归
由于此前已对二叉树介绍过,在此便不多做解释;全是递归操作,先左后右;创建一个变量: BinaryTreeNode<T>* _pRoot;以下是操作是创建树 void _CreateTree(Node*& pRoot, const T array[], size_t size, size_t& index, const T& invalid) //创建一个树 { if(index<size&&原创 2017-05-29 16:36:55 · 558 阅读 · 0 评论 -
最快最简单的排序—桶排序
我们学过很多的排序方法,冒泡排序、希尔排序、快速排序……今天我想说的是一种应用起来最快最简单的排序——桶排序。当你随机输入几个数,进行从小到大(从大到小)依次排序;你会有什么方法? 这里只需一个一维数组即可。申请一个长度为n的一维数组。就相当于定义n个变量arr[0]~arr[n-1]; 刚开始都初始化为0,表示没有任何东西使用它。下来我们将某个数字对应的数组下表的数组的值增加1。即arr[0]=原创 2017-08-30 00:15:33 · 1501 阅读 · 1 评论 -
大小堆操作
大小堆的概念: 如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树 的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2*i+1 且 Ki<= K2*i+2 (Ki >= K2*i+1 且 Ki >= K2*i+2) i = 0,1,2…,则称这个堆为最小堆(或最大 堆)。最小堆:任一结点的关键码均小于等于它的左右孩子的关键码,位于堆顶结点的关原创 2017-05-29 17:00:07 · 394 阅读 · 0 评论 -
AVL树的实现
AVL树的概念:一颗AVL树要么是空树要么就是满足一下条件的二叉搜索树: 1)它的左右子树都是AVL树; 2)左子树与右子树高度之差的绝对值不超过1;这里的左子树与右子树高度之差称为平衡因子。以下是定义结点:template<class K,class V> struct AVLTreeNode{ AVLTreeNode(const K& k,const V& v)原创 2017-06-03 22:20:42 · 335 阅读 · 0 评论 -
AVL旋转图及其代码的实现
1) 左单旋转 未插入前: 插入后: 旋转图: 旋转后: 下面是左单旋代码的实现: void _Rotatel(Node* parent) //左单旋 { Node* pSubR=parent->_pright; Node* pSubRL=pSubR->_pleft; Node * pPParent=paren原创 2017-06-04 15:06:42 · 986 阅读 · 0 评论 -
二叉树的实现
最近刚学了数据结构,对于其中的数有了少许理解,就写了如下的代码: 那么些代码前,先看一下什么是树以及二叉树: 一、树的基本概念 1.树分为以下几种情况: a.空树; b.只有一个结点的树; c.有根节点以及孩子结点; 2.度:一个结点所具有的子树的个数; 2.树的度:树中所有度的最大值; 3.孩子:树中一个结点的子树的根节点称为这个结点的子树(这个结点的直接后继); 4.双亲结点原创 2017-04-25 16:09:29 · 294 阅读 · 0 评论 -
二叉搜索树
说起二叉搜索树,那么到底怎样的树才是二叉搜索树呢? 下面我们来看看:它或者是一棵空树,或者是具有下列性质的二叉树: 1)若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 3)它的左、右子树也分别为二叉排序树。在创建树之前先创建结点: 这里使用键值对:template<class K, class V>原创 2017-05-29 17:25:22 · 261 阅读 · 0 评论