数据结构与算法
文章平均质量分 66
我可能是个假开发
hongcaixia
展开
-
【算法】双指针
头指针和尾指针,头指针从下标0开始,尾指针从最后一个元素(下标nums.length-1)开始,头指针前进,尾指针后退,直到相遇就是遍历完了;遍历的过程中,每次都取出更大的那个数,存入一个新的数组中,从最后一个下标往前存,因为是非递减的。给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。没有遇到目标元素时所指向的元素(符合的元素),都存入新数组(slow指向)定义一个慢指针slow,用来指向新的数组的元素(删除了目标元素后的)原创 2024-05-03 15:55:32 · 436 阅读 · 0 评论 -
Leetcode02.05:链表求和
思路:因为链表是按照个位十位百位逆序存储的,所以直接顺序遍历链表,第一个就是个位,接着十位,百位等。两个链表的值相加存储作为一个新节点存储,进位信息单独存到一个变量中,每次都加上这个进位信息。给定两个用链表表示的整数,每个节点包含一个数位。编写函数对这两个整数求和,并用链表形式返回结果。这些数位是反向存放的,也就是个位排在链表首部。原创 2024-02-05 18:31:50 · 538 阅读 · 0 评论 -
【算法】递归
递归是一种解决计算问题的方法,解决方案取决于同一类问题的更小子集。自己调用自己,如果说每个函数对应着一种解决方案,自己调用自己意味着解决方案是一样的(有规律的)每次调用,函数处理的数据会较上次缩减(子集),而且最后会缩减至无需继续递内层函数调用(子集处理) 完成,外层函数才能算调用完成return;原创 2024-05-19 18:40:26 · 729 阅读 · 0 评论 -
Leetcode29:两数相除
例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2。思路:判断乘数b的位数是不是1,通过让他和1进行&运算,如果是1,说明当前位是1。得到的 ^运算结果 和 &运算结果左移 相加就是和,依次执行,直到进位信息没有了,就通过位运算实现了加法。如果两个都为1,那么就会有进位信息,用&运算,得到的就是1,再往左移动一位,结果就是进位信息。&完的结果如果是1,把被乘数a作为要相加的和,左移一位(下一次如果是1的和)。使用^运算(^ : 两个位相同为0,相异为1)的到的结果就是无进位相加的结果。原创 2024-02-14 23:53:01 · 536 阅读 · 0 评论 -
Leetcode92:反转链表II(区间反转链表)
每次让left后面的节点(cur指针指向的元素)插入到left前面(preHead指针的位置)。即头插法(可以看我上一篇文章的反转链表的第一种解法,只是这里不创建新的节点,而是直接改变前后节点的指针;因为按照3个指针的写法,left位置前面是有一个节点的,但是如果要逆序的就是第一个和第二个,如果没有头节点,preHead就不存在了,就又要特殊处理。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表。left和right是索引,但是是从1开始(很无语,,,害我写了好多次才通过)原创 2024-02-03 22:46:22 · 533 阅读 · 0 评论 -
Leetcode24:两两交换链表中的节点
思路:让一个指针指向要交换的两个节点的前一个节点(cur),每次让两个要交换的节点的后一个节点来到cur的后面。cur指针再向前移动两位。直到cur的后一位没有元素(奇数个元素)或者cur的后一位的后一位没有元素(偶数个元素)给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。因为第一个节点没有前一个元素,所以设置一个虚拟头节点,方便第一个元素和后面的元素能走相同的逻辑。原创 2024-02-04 14:27:43 · 534 阅读 · 0 评论 -
Leetcode206:反转链表
在递归内部的操作把指针的指向改变,为了防止循环引用,在改变完当前节点的指向后,还要把前一个节点的指针指为空。构造一个新链表,从旧链表中取出节点,一个个插入到新链表的头部,最后就逆序了。给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。通过递归调用每次让头指针往后移,即相当于执行了。原创 2024-02-02 12:39:01 · 497 阅读 · 0 评论 -
【算法】二分查找
给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1, -1]。你必须设计并实现时间复杂度为O(log n)的算法解决此问题。// 查找最左侧元素}else{// 查找最右侧元素int i = 0;j = mid -1;}else {// 最左元素}else{//最右元素。原创 2024-05-02 15:26:46 · 819 阅读 · 3 评论 -
Leetcode21:合并两个有序链表
一开始先找出头更小的那个链表作为头节点,依次取出两个指针指向的链表元素,谁小,就改变当前节点的指向,让当前节点始终指向更小的元素。两个指针一直前进,当指向为空时,遍历结束。将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。思路:分别用两个指针遍历两个链表,再用一个指针专门改变链表的指向。原创 2024-02-06 19:38:24 · 610 阅读 · 0 评论 -
【算法】滑动窗口
在算法中,滑动窗口是一种处理连续子数组或子字符串的技术。它通过定义一个固定大小的窗口,使用两个指针,在数组或字符串上移动这个窗口,以便对窗口内的数据进行操作或计算。原创 2024-05-05 19:22:40 · 426 阅读 · 0 评论 -
数据结构概述
数据结构概述一、定义我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应的操作,这个相应的操作也叫算法数据结构=个体+个体的关系 算法=对存储数据的操作算法:解题的方法和步骤衡量算法的标准: ①时间复杂度:大概程序要执行的次数,而非执行的时...原创 2018-06-25 15:32:43 · 363 阅读 · 0 评论 -
图
图在线性表中,每个元素之间只有一个直接前驱和一个直接后继, 在树形结构中,数据元素之间是层次关系,并且每一层上的数据元素可能和下一层中多个元素相关,但只能和上一层中一个元素相关。但这仅仅都只是一对一,一对多的简单模型,如果要研究如人与人之间关系就非常复杂了。一、图的定义图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,...原创 2018-04-05 11:51:29 · 415 阅读 · 0 评论 -
赫夫曼树与赫夫曼编码
赫夫曼树与赫夫曼编码一、赫夫曼树在数据膨胀、信息爆炸的今天,数据压缩的意义不言而喻。谈到数据压缩,就不能不提赫夫曼(Huffman)编码,赫夫曼编码是首个实用的压缩编码方案,即使在今天的许多知名压缩算法里,依然可以见到赫夫曼编码的影子。另外,在数据通信中,用二进制给每个字符进行编码时不得不面对的一个问题是如何使电文总长最短且不产生二义性。根据字符出现频率,利用赫夫曼编码可以构造出一...原创 2018-04-04 15:50:52 · 568 阅读 · 0 评论 -
树、森林及二叉树的相互转换
树、森林及二叉树的相互转换一、普通树转换为二叉树步骤如下:加线,在所有兄弟结点之间加一条连线。去线,对树中每个结点,只保留它与第一孩子结点的连线,删除它与其他孩子结点之间的连线。层次调整,以树的根结点为轴心,将整棵树顺时针旋转一定的角度,使之结构层次分明。二、森林转换为二叉树步骤如下:把每棵树转换为二叉树。第一棵二叉树不动,从第二棵二叉树开始,依次把...原创 2018-04-04 13:15:41 · 519 阅读 · 0 评论 -
线索二叉树
线索二叉树一、线索二叉树由来由于普通的二叉树的缺陷导致了空间的巨大浪费,如:数序题:请问以下有多少个“^”?总共浪费了多少字节的空间?(32bit的机器)我们知道通过对二叉树的约定遍历方式,可以得到一个固定的遍历顺序,那么请问哪种遍历方式可以节省“^”所浪费的空间?(利用“^”记录该结点的前驱后继)经过分析可以得出,上图经过中序遍历后结果是:HDIBEAFCG我...原创 2018-04-04 11:00:22 · 252 阅读 · 0 评论 -
线性表--链式存储结构--循环链表
循环链表对于单链表,由于每个结点只存储了向后的指针,到了尾部标识就停止了向后链的操作。也就是说,按照这样的方式,只能索引后继结点不能索引前驱结点。这会带来什么问题呢? 例如不从头结点出发,就无法访问到全部结点。 事实上要解决这个问题也并不麻烦,只需要将单链表中终端结点的指针端由空指针改为指向头结点,问题就结了。一、定义将单链表中终端结点的指针端由空指针改为指向头结点,就使整...原创 2018-03-28 19:27:56 · 417 阅读 · 0 评论 -
二叉树的遍历
二叉树的遍历一、二叉树的遍历二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。 二叉树的遍历次序不同于线性结构,线性结构最多也就是分为顺序、循环、双向等简单的遍历方式。二叉树的遍历方式可以很多,如果我们限制了从左到右的习惯方式,那么主要就分为一下四种:前序遍历中序遍历后序...原创 2018-04-04 09:12:40 · 345 阅读 · 1 评论 -
算法的时间复杂度和空间复杂度
算法的时间复杂度和空间复杂度一、算法效率的度量方法1.事后统计方法这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。2.事前分析估算方法在计算机程序编写前,依据统计方法对算法进行估算。经过总结,我们发现一个高级语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:算法采用的策略,方案编译...原创 2018-02-27 21:07:14 · 1778 阅读 · 0 评论 -
线性表--基本概念
线性表–基本概念一、定义线性表(List):由零个或多个数据元素组成的有限序列。注意: - 首先它是一个序列,也就是说元素之间是有个先来后到的,即元素之间是有顺序的。 - 若元素存在多个,则第一个元素无前驱,而最后一个元素无后继,其他元素都有且只有一个前驱和后继。 - 另外,线性表强调是有限的,事实上无论计算机发展到多强大,它所处理的元素都是有限的。如果用数学语言来进行定...原创 2018-03-08 13:57:25 · 508 阅读 · 0 评论 -
线性表--顺序存储结构
一、线性表的顺序存储结构线性表有两种物理存储结构:顺序存储结构和链式存储结构。顺序存储结构①定义: 用一段地址连续的存储单元依次存储线性表的数据元素。②线性表(a1,a2,…,an)的顺序存储如下: 物理上的存储方式事实上就是在内存中找个初始地址,然后通过占位的形式,把一定的内存空间给占了,然后把相同数据类型的数据元素依次放在这块空地中。③线性表顺序存储结构...原创 2018-03-08 14:05:00 · 6080 阅读 · 1 评论 -
线性表--链式存储结构--单链表
线性表–链式存储结构–单链表一、定义1.特点:用一组任意的存储单元存储线性表的数据元素,这组存储单元可以存在内存中未被占用的任意位置。比起顺序存储结构每个数据元素只需要存储一个位置就可以了。现在链式存储结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址(指针)。也就是说除了存储其本身的信息外,还需存储一个指示其直接后继的存储位置的信息。2.定义:我们...原创 2018-03-23 14:56:04 · 619 阅读 · 0 评论 -
线性表--链式存储结构--双向链表
双向链表一、双向链表结构双向链表结点结构typedef struct DualNode{ ElemType data; struct DualNode *prior; //前驱结点 struct DualNode *next; //后继结点} DualNode, *DuLinkList;既然单链表可以有循环链表,那么双向链表当然也可以...原创 2018-03-29 19:25:36 · 939 阅读 · 0 评论 -
栈--利用栈实现进制转换
利用栈实现进制转换一、二进制转十进制利用栈的数据结构特点,将二进制转换为十进制数。二进制数是计算机数据的存储形式,它是由一串0和1组成的,每个二进制数转换成相应的十进制数方法如下: (XnXn-1……X3X2X1)2 = X1*2^0+X2*2^1+…+Xn*2^(n-1)一个二进制数要转换为相应的十进制数,就是从最低位起用每一位去乘以对应位的积,也就是说用第n位去乘以2^(...原创 2018-03-30 15:32:58 · 29699 阅读 · 1 评论 -
栈的顺序存储结构
栈的顺序存储结构栈是一种重要的线性结构,可以这样讲,栈是线性表的一种具体形式。栈这种后进先出的数据结构应用是非常广泛的。 在生活中,例如我们的浏览器,每点击一次“后退”都是退回到最近的一次浏览网页。 例如我们Word,Photoshop等的“撤销”功能也是如此。再例如我们C语言的函数,也是利用栈的基本原理实现的。一、定义栈(Stack)是一个后进先出(Last in first...原创 2018-03-30 14:45:18 · 6235 阅读 · 1 评论 -
队列
队列一、定义队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。与栈相反,队列是一种先进先出(First In First Out, FIFO)的线性表。与栈相同,队列也是一种重要的线性结构,实现一个队列同样需要顺序表或链表作为基础。队列在现实中也是应用十分广泛:输入缓冲区接受键盘的输入就是按队列的形式输入和输出的。用企鹅发一句“Yo...原创 2018-04-02 11:01:41 · 288 阅读 · 0 评论 -
线性表--链式存储结构--静态链表
静态链表一、存储结构#define MAXSIZE 1000typedef struct{ ElemType data; // 数据 int cur; // 游标(Cursor)} Component, StaticLinkList[MAXSIZE];其中,有两对元素是特殊的:第一对:下标为0的元素,其数据不存放东西;其游标是...原创 2018-03-27 10:52:51 · 787 阅读 · 1 评论 -
循环队列
循环队列队列的实现上我们更愿意用链式存储结构来存储。一、队列的顺序存储结构先按照应有的思路来考虑下如何构造队列的顺序存储结构。假设一个队列有n个元素,则顺序存储的队列需建立一个大于n的存储单元,并把队列的所有元素存储在数组的前n个单元,数组下标为0的一端则是队头。1.入队操作入队列操作其实就是在队尾追加一个元素,不需要任何移动,时间复杂度为O(1)。2....原创 2018-04-02 16:23:22 · 2463 阅读 · 0 评论 -
递归与分治
递归与分治一、斐波那契(Fibonacci)数列的递归实现他讲的一个故事: 如果说兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。假设所有兔子都不会死去,能够一直干下去,那么一年以后可以繁殖多少对兔子呢?用数学函数来定义:1.使用迭代来实现打印出前40位斐波那契数列数#include <stdio.h>int main()...原创 2018-04-03 10:15:01 · 3251 阅读 · 0 评论 -
树
树无论是线性表也好,栈和队列也罢,都是一对一的线性结构,都是2P模式。 而树是一种一对多的数据结构。一、定义树(Tree)是n(n>=0)个结点的有限集。当n=0时成为空树,在任意一棵非空树中:有且仅有一个特定的称为根(Root)的结点;当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、…、Tm,其中每一个集合本身又是一棵树,并且称为根...原创 2018-04-03 14:24:34 · 320 阅读 · 0 评论 -
二叉树
二叉树一、定义二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。(这个定义显然是递归形式的)二、二叉树的特点1.每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。 注意:不是都需要两棵子树,而是最多可以是两棵, 没有子树...原创 2018-04-03 18:36:33 · 539 阅读 · 0 评论 -
数据结构与算法概论
数据结构与算法概论一、基本概念数据:描述客观事物的数、字符以及能输入计算机中并被计算机处理的符号集合数据元素:是数据的基本单位。有时一个数据元素可由若干个数据项(也称为字段、域、属性)组成。数据对象:是具有相同性质的数据元素的集合,是数据的一个子集。数据项:是具有独立含义的最小标识单位数据结构:带有结构的数据元素的集合。结构指的是数据元素之间的相互关系,即数据的组织形式...原创 2018-02-26 20:10:56 · 494 阅读 · 2 评论