数据结构与算法
阳光丿洒脱
死亡不是终点,遗忘才是。
展开
-
哈希的概念及其操作
哈希概念顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O( Log2N),搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够...原创 2019-12-08 19:03:03 · 1063 阅读 · 0 评论 -
排序下---(冒泡排序,快速排序,快速排序优化,快速排序非递归,归并排序,计数排序)
交换类排序基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。冒泡排序冒泡排序的特性总结:冒泡排序是一种非常容易理解的排序时间复杂度:O(N^2)空间复杂度:O(1)稳定性:稳定代码实现void BublleSort(int*array, int size...原创 2019-12-07 21:01:30 · 148 阅读 · 0 评论 -
排序上---(排序概念,常见排序算法,直接插入,希尔排序,直接选择排序,堆排序)
排序的概念排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。内部排序:数据元素全部放在内存中...原创 2019-12-07 12:36:30 · 194 阅读 · 0 评论 -
201301 JAVA2~3级---走格子
请编写一个函数(允许增加子函数),计算n x m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。解答用递归来做,将右下角看做原点(0, 0),左上角看做坐标(m, n),下图所示:从(m, n)—>(0, 0)就分两步走:往右走一步:f(m, n - 1)—>(0, ...原创 2019-11-17 16:23:15 · 210 阅读 · 0 评论 -
二叉树题目 ----7 前序中序遍历构造二叉树
前序中序遍历构造二叉树思路在前序中找根结点根据根结点 + 中序,分成左右两棵子树根据子树长度,把前序分成左右两颗子树递归处理子树/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct Tree...原创 2019-10-12 15:22:17 · 340 阅读 · 0 评论 -
二叉树题目----6 二叉树的最近公共祖先 AND 二叉树搜索树转换成排序双向链表
二叉树的最近公共祖先思路在左、右子树中分别查找是否包含p或q:如果以下两种情况(左子树包含p,右子树包含q/左子树包含q,右子树包含p),那么此时的根节点就是最近公共祖先如果左子树包含p和q,那么到root->left中继续查找,最近公共祖先在左子树里面如果右子树包含p和q,那么到root->right中继续查找,最近公共祖先在右子树里面 struct TreeNo...原创 2019-10-12 11:28:23 · 137 阅读 · 0 评论 -
再谈二叉树(二叉树概念,二叉树的性质,二叉树的存储结构)
树的概念树的概念树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个结点有零个或多 个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结 点可以分为多个不相交的子树一些基本概念节点的度:一个节点含有的子树的个数称...原创 2019-10-06 08:54:03 · 283 阅读 · 0 评论 -
再写循环队列----c++实现
再写循环队列class MyCircularQueue {public: /** Initialize your data structure here. Set the size of the queue to be k. */ MyCircularQueue(int k) { array = (int *)malloc(sizeof(int)*k); capacity = k...原创 2019-10-05 18:28:49 · 169 阅读 · 0 评论 -
最小栈的实现(设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。)
最小栈的实现思路两个栈,左边栈接受元素,右边栈存最小的元素入栈时,先入左边栈,随后进行比较,左边和右边栈顶元素进行比较,如果新元素小,就把新元素放在右边的栈顶位置,如果新元素大,则还是把右边栈顶元素放在栈顶的位置出栈时,出的是最后一个入栈元素,所以就是左边的栈出栈出最小值时,就是右边的栈顶元素出栈出栈时两个都得出class MinStack {public: /** ini...原创 2019-10-05 17:48:29 · 4601 阅读 · 1 评论 -
用队列实现栈 AND 用栈实现队列
用队列实现栈思路入队列就是入栈出队列的时候,就是把前面size-1个队列中的元素先出,这样最后一个元素就成队首元素了,再把出去的元素再次入队列读栈顶元素,过程和第二步是一样的,就是弹出后,再把它入队列typedef struct Node{ int value; struct Node *next;}Node;//头删+尾插typedef struct Queue{...原创 2019-10-05 17:08:22 · 111 阅读 · 0 评论 -
括号匹配问题(c和c++版本实现)
括号匹配问题思路遇见左括号入栈,遇见一个右括号弹出栈顶元素右括号入栈前如果栈已经为空,则不匹配如果不为空则读取并弹出,弹出来的元素与右括号做比较,必须匹配,不匹配返回false;如果最后栈里还有元素,则说明不匹配c版本实现typedef struct Stack{ int array[1000000]; int top;} Stack;//初始化void Stack...原创 2019-10-05 15:59:32 · 1739 阅读 · 0 评论 -
二叉树题目----1 前序中序后序遍历二叉树并返回相应的遍历(不是打印)
前序遍历/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; *//** * Note: The returned array must be ma...原创 2019-10-06 09:06:57 · 143 阅读 · 0 评论 -
二叉树题目----2 检查两颗树是否相同 和 对称二叉树的判定
检查两颗树是否相同思路根要相等 p->val == q->val左子树相等 isSameTree(p->left,q->left)右子树也要相等 isSameTree(p->right,q->right)/** * Definition for a binary tree node. * struct TreeNode { * in...原创 2019-10-06 10:29:47 · 192 阅读 · 0 评论 -
二叉树题目---3 另一个树的子树 AND 二叉树最大深度
另一个树的子树原创 2019-10-07 09:25:45 · 140 阅读 · 0 评论 -
二叉树题目----4 前序遍历重构二叉树 AND 求二叉树中所有结点的个数
前序遍历重构二叉树思路整个二叉树用数组存储因为先序遍历它先遍历根,再遍历左,左边没有跑完是不会去遍历右边的,所以遍历左子树,就是数组元素每回向后一个,个数-1遍历右边时,就是数组起始位置+左子树跑到的位置+每次往后走一个,大小就是减去左子树用掉的个数+每回个数-1因为要返回遍历的位置,和遍历用掉的个数,所以每回都要返回两个值,用结构体返回。#include<stdlib....原创 2019-10-07 10:44:49 · 180 阅读 · 0 评论 -
二叉树的进阶操作---(求二叉树中所有结点个数,求叶子结点个数,求第k层结点个数;在二叉树中查找某一结点;层序遍历;判断是否为完全二叉树)
typedef struct TreeNode{ struct TreeNode *left; struct TreeNode *right; char val;}TreeNode;typedef struct Result{ TreeNode * root; //构建的树的根结点 int used; //构建过程中用掉的val个数} Result;求二叉树中...原创 2019-10-08 17:20:35 · 1168 阅读 · 0 评论 -
二叉树题目----5 平衡二叉树 AND 根据二叉树创建字符串
平衡二叉树/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */int MAX(int a,int b){ return a > b...原创 2019-10-11 16:01:45 · 168 阅读 · 0 评论 -
再写堆(堆的性质,向下调整,建堆,堆的插入删除初始化,堆排序,TopK问题)
堆的概念如果有一个关键码的集合K={k0,k1,k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储再一个一维数组中,并满足:Ki<=K2i+1且Ki<=K2i+1(Ki >= K2i+1 且 Ki >= K2i+2),i=0,1,2,3…。则称为小堆(或大堆)。将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆堆的性质堆中某个节点的...原创 2019-10-11 19:05:32 · 470 阅读 · 0 评论 -
链表题目---6 复制带随机指针的链表
思路将新结点放在老结点的后面复制random将链表拆开/*// Definition for a Node.class Node {public: int val; Node* next; Node* random; Node() {} Node(int _val, Node* _next, Node* _random) { ...原创 2019-10-05 11:21:32 · 244 阅读 · 0 评论 -
链表题目----5 相交链表 和 环形链表 和 返回链表开始入环的第一个节点
相交链表思路链表交叉不可能是x型因为有可能两个链表不等长,所以我们必须让他们从同一起跑位置去起跑从同一起跑位置出发,依次比较每个结点的地址是否相同/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; *...原创 2019-10-05 09:07:18 · 136 阅读 · 0 评论 -
归并排序概念及其实现
基本思想:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。代码实现非递归方法归并排序的特性总结:归并的缺点在于需要O(N)的空间复杂度,归并排...原创 2019-04-26 11:10:19 · 230 阅读 · 0 评论 -
计数排序和基数排序
适用于数据集中在某个范围中,//统计每个数据出现的次数计数排序:鸽巢原理1找范围2给空间3记次数4回收for(int i =0;i<size; ++i){ temp[array[i]]++;}for(int i=0;i<range;++i){ while(temp[i]) array[index++]=i;}代码实现时间复杂度:O(N)N...原创 2019-04-26 12:01:22 · 143 阅读 · 0 评论 -
排序(基本概念及分类,直接插入排序和希尔排序)
排序的概念排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。两个数相等时,第一个数排序前在另...原创 2019-04-17 20:56:43 · 571 阅读 · 0 评论 -
直接交换排序
直接交换排序选择排序优化原创 2019-04-17 21:33:51 · 1260 阅读 · 0 评论 -
冒泡排序
冒泡排序冒泡排序的特性总结:1. 冒泡排序是一种非常容易理解的排序2. 时间复杂度:O(N^2) 3. 空间复杂度:O(1)4. 稳定性:稳定原创 2019-04-18 18:10:05 · 108 阅读 · 0 评论 -
快速排序概念及实现
快速排序快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。将区间按照基准值划分为左右两半部分的常见方式有:1. hoare版本2. 挖坑法3. 前...原创 2019-04-18 19:25:51 · 309 阅读 · 0 评论 -
循环队列基本操作(解决队列假溢出)
循环队列原创 2019-08-05 15:07:52 · 4153 阅读 · 0 评论 -
栈和队列的基本操作(栈和队列的区别)
栈创建一个结构体,里面包含一个数组就是我们的栈(用顺序表的形式来存储),还有一个整形来记录栈的长度。初始化就是让栈中元素个数记为0就行。往栈中加入数据,就是向下标为size 的数组元素中存值,存完后,数组长度size++。删除,就让数据个数减一个就行。读栈顶元素就是要返回最后入栈的值,然后栈中元素个数减一。队列队列就用链表实现...原创 2019-03-25 23:27:23 · 24918 阅读 · 1 评论 -
字符串题目 1 --------判断两个字符串是否为旋转词
题目描述如果一个字符串为str,把字符串的前面任意部分挪到后面形成的字符串交str的旋转词。比如str=“12345”,str的旋转串有“12345”、“45123”等等。给定两个字符串,判断是否为旋转词。输入描述:输出包含三行,第一个两个整数n和m(1 \leq n,m \leq10^5 )(1≤n,m≤10 ^5 ),分别表示两个字符串的长度。第二行和第三行各输入一个字符串。输出描述:...原创 2019-09-25 17:11:09 · 369 阅读 · 0 评论 -
字符串题目---2判断两个字符串是否为变形词
题目描述给定两个字符串str1和str2,如果str1和str2中出现的字符种类出现的一样且每种字符出现的次数也一样,那么str1和str2互为变形词。请判断str1和str2是否为变形词输入描述:输入包括3行,第一行包含两个整数n,m(1 \leq n,m\leq 10^5)(1≤n,m≤10^5)分别代表str1和str2的长度,第二行和第三行为两个字符串,分别代表str1和str2。...原创 2019-09-25 20:39:52 · 274 阅读 · 0 评论 -
再写顺序表(c语言实现,外加冒泡排序,二分查找)
概念顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组 上完成数据的增删查改。顺序表一般可以分为:静态顺序表:使用定长数组存储。动态顺序表:使用动态开辟的数组存储。头文件声明SeqList.h#pragma once#include<stdbool.h>typedef int SDataType;/*//静态顺...原创 2019-10-03 11:49:21 · 921 阅读 · 0 评论 -
再写单链表(不带头单链表)
单链表实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:单向、双向带头、不带头循环、非循环虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构:无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结 构,如哈希桶、图的邻接表等等。另外这种结构在学校的考试中出现很多。带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用...原创 2019-10-03 16:35:29 · 149 阅读 · 0 评论 -
再写双向循环链表
#pragma once#include<assert.h>#include<malloc.h>#include<stdio.h>typedef int DLDataType;//定义链表结点结构typedef struct DListNode{ DLDataType value; struct DListNode *prev; //指向前...原创 2019-10-03 18:21:53 · 327 阅读 · 0 评论 -
链表题目--1 删除链表中所有等于val的值
注意事项要删除的结点相邻第一个结点就是要删除的结点/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* removeElements(struct ListNode...原创 2019-10-03 18:49:57 · 668 阅读 · 0 评论 -
链表题目--2 求链表的中间结点 和 求链表中倒数第k个结点
思路一个走两步,一个走一步。一个走到尾,另外一个就走到了中间原创 2019-10-04 11:22:07 · 209 阅读 · 0 评论 -
链表题目---3 合并两个有序单链表 和 分割链表
合并两个有序单链表/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode*...原创 2019-10-04 15:10:28 · 224 阅读 · 0 评论 -
链表题目---4 删除链表中重复的结点 和 判断链表是否为回文链表
删除链表中重复的结点/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* deleteDuplication(ListNod...原创 2019-10-05 08:35:41 · 111 阅读 · 0 评论 -
堆的应用(堆排序,TopK问题)
堆的应用1)排序 堆排序选择排序既可以找到最大的放在最后也可以找到最小的方最前但是,堆排序不能找最小的放在最前因为把最小数放在最前,会破坏掉堆的原来的顺序,除非重新建堆1, 2,9,16,7,15,18,45,37,63,1363,45,18,16,37,9,2,7,15,13,11,45,18,16,37,9,2,7,15,13, 63 再向下调整即可堆排序...原创 2019-04-15 17:37:51 · 689 阅读 · 0 评论