数据结构与算法
合道为善
这个作者很懒,什么都没留下…
展开
-
汉诺塔问题
#include<iostream>using namespace std;void move(int n, char moveFrom, char buffer, char moveTo){ if (n == 1) { cout << moveFrom << " -> " << moveTo << endl; ...原创 2020-03-15 19:21:44 · 124 阅读 · 0 评论 -
正则表达式校验时间格式
"^(" + "(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0...原创 2019-12-06 19:26:39 · 223 阅读 · 0 评论 -
插入排序
#include<iostream>using namespace std;void insert_sort(int arr[], int len){ for (int i = 1; i < len; i++) { for (int j = i; j > 0 && arr[j - 1] > arr[j]; j-...原创 2018-09-14 16:40:12 · 70 阅读 · 0 评论 -
等价BST
中序遍历序列相同 两点原则: 1、上下可变:联接关系不尽相同,承袭关系可能颠倒 2、左右不乱:中序遍历序列完全一致,全局单调非降原创 2019-08-29 23:03:39 · 61 阅读 · 0 评论 -
BST
算法实现 - 查找算法(递归实现) hot参数:记录当前接受访问的非空节点查找成功时,返回指向目标节点的父节点; 失败时返回NULL 统一语义 插入算法(忽略重复元素) 复杂度:O(h)O(h)O(h)-删除算法removeAt分两种情况 (1)若某一子树为空,则将该节点替换为其子树; (2)左右子树均不为空 将其替换为其中序遍历时的直接...原创 2019-08-29 23:02:35 · 65 阅读 · 0 评论 -
机器人的运动范围
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?回溯法:bool check(int x, ...原创 2019-08-29 22:54:52 · 56 阅读 · 0 评论 -
红黑树
定义:由红、黑两类节点组成的BST (统一增设外部节点NULL,使之成为真二叉树) 树根:必为黑色外部节点:均为黑色 其余节点:若为红,则只能有黑孩子外部节点到根:途中黑色节点数目相等 插入...原创 2019-08-29 22:59:01 · 69 阅读 · 0 评论 -
KMP
1、蛮力匹配: 版本1:版本2: 效率分析:最好情况:O(m)最坏情况:O(m * n)2、KMP算法算法 next表实例 next表构造(仅取决于模式串) 哨兵 next[0]=−1;next[0]=−1;next[0] = -1; next[j+1]<=next[j]+1next[j+1]<=next[j]+1next[j +...原创 2019-08-29 23:08:45 · 66 阅读 · 0 评论 -
高度最小的BST
对于一个元素各不相同且按升序排列的有序序列,请编写一个算法,创建一棵高度最小的二叉查找树。给定一个有序序列int[] vals,请返回创建的二叉查找树的高度。 https://www.nowcoder.com/practice/01a12f94988649e39b554d95c45bfa6f?tpId=8&tqId=11013&tPage=1&rp=1&ru=...原创 2018-04-13 16:41:18 · 102 阅读 · 0 评论 -
回溯算法
矩阵中的路径 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径,因为字符串的第一个字...转载 2018-04-23 12:22:05 · 373 阅读 · 0 评论 -
平衡二叉树(AVL树)
平衡因子 失衡与重平衡 (1)插入:可能使其多个祖先节点失衡 (2)删除:最多只有一个祖先失衡 插入操作 (1)单旋 不改变其祖先的高度,即恢复插入数据前的平衡状态 (2)双旋:断开前先保存其指向的节点;先向下探后上探;(3)实现插入 删除 zig(g)失衡节点 (1)单旋 (2)双旋 (3)实现 旋转实现: 3 + 4重构...原创 2019-08-29 23:04:39 · 61 阅读 · 0 评论 -
伸展树
1、局部性 刚被访问过的数据极有可能很快被再次访问; 2、逐层伸展 节点v一旦被访问,随即转移至树根 3、最坏情况 4、改进 当子孙同侧时效果最好关键:从祖父节点开始旋转而不是逐层伸展 实例 折叠效果:一旦访问坏节点,对应路径的长度随即减半最坏情况不致持续发生分摊为log(n)log(n)log(n)实现 当前节点作为_...原创 2019-08-29 23:05:05 · 67 阅读 · 0 评论 -
翻转链表
输入一个链表,反转链表后,输出链表的所有元素。 https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca?tpId=13&tqId=11168&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/quest...原创 2019-09-10 23:06:21 · 64 阅读 · 0 评论 -
红黑树
定义:由红、黑两类节点组成的BST (统一增设外部节点NULL,使之成为真二叉树) 树根:必为黑色外部节点:均为黑色 其余节点:若为红,则只能有黑孩子外部节点到根:途中黑色节点数目相等 插入...原创 2019-09-10 23:03:43 · 80 阅读 · 0 评论 -
双栈排序(vector的使用)
请编写一个程序,按升序对栈进行排序(即最大元素位于栈顶),要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中。给定一个int[] numbers(C++中为vector<int>),其中第一个元素为栈顶,请返回排序后的栈。请注意这是一个栈,意味着排序过程中你只能访问到第一个元素。 https://www.nowcoder.com/practice/d0d0...原创 2019-08-29 22:50:54 · 79 阅读 · 0 评论 -
牛牛找工作
牛牛找工作为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。 输入描述: 每个输入包含一个测试用例。 每个测试用例的第一行包含两个正整数,分别表示工作...原创 2019-08-29 23:06:49 · 56 阅读 · 0 评论 -
冒泡排序
#include<iostream>using namespace std;void bubble_sort(int arr[], int len){ for (int i = 0; i < len; i++){ for (int j = len - 1; j > i; j--) { if (arr[j - 1] &g...原创 2018-09-14 17:30:18 · 81 阅读 · 0 评论 -
简单选择排序
#include<iostream>using namespace std;void select_sort(int arr[], int len) { for (int i = 0; i < len; i++) { int min = i; for (int j = i + 1; j < len; j++) { ...原创 2018-09-14 17:52:40 · 85 阅读 · 0 评论 -
希尔排序
1、希尔排序 将整个序列视作一个矩阵,逐列各自排序2、性能分析:希尔序列:{1, 2, 4, 8, …, 2N, …} 最坏情况下:O(n2)时间 平均性能:O(nlogn) 存储空间:O(1) 稳定性:不稳定3、算法框架 #include&amp;lt;iostream&amp;gt;using namespace std;void shellSort(int arr[...转载 2018-04-04 15:42:03 · 77 阅读 · 0 评论 -
从尾到头打印链表 / 递归
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。 vector<int> iVec; vector<int> printListFromTailToHead(ListNode* head) { if(head == NULL) return iVec; if(head ...转载 2018-09-06 16:10:19 · 167 阅读 · 0 评论 -
快速排序
核心:快速确定轴点 轴点:左侧的元素均比它大,右侧的元素均比它小 [lo, hi) = [lo, mi) + [mi] + (mi, hi) 1、轴点: 快速排序:将所有元素逐个转换为轴点的过程; lo和hi交替向内侧移动,使之靠近int partition(int arr[], int lo, int hi) { int pivot = arr[lo];...原创 2018-04-04 00:01:44 · 136 阅读 · 0 评论 -
牛牛的背包问题(网易2018春招)
牛牛准备参加学校组织的春游, 出发前牛牛准备往背包里装入一些零食, 牛牛的背包容量为w。 牛牛家里一共有n袋零食, 第i袋零食体积为v[i]。 牛牛想知道在总体积不超过背包容量的情况下,他一共有多少种零食放法(总体积为0也算一种放法)。 输入描述: 输入包括两行 第一行为两个正整数n和w(1 <= n <= 30, 1 <= w <= 2 * 10^9)...原创 2019-08-29 23:07:16 · 77 阅读 · 0 评论 -
二分查找
旋转数组的最小数字: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 https://www.nowcoder.com/profile/648947/codeBoo...原创 2019-08-29 22:48:57 · 59 阅读 · 0 评论 -
二叉树中和为某一路径的值(DFS)
112 Path Sum 给定一棵二叉树和一个和,确定树是否有根到叶的路径,以便沿路径加起来的所有值等于给定的总和。 https://leetcode.com/problems/path-sum/description/bool hasPathSum(TreeNode* root, int sum) { if(root == nullptr) ...原创 2018-04-02 22:54:02 · 471 阅读 · 0 评论 -
是否为子树(DFS)
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) https://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88?tpId=13&tqId=11170&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/c...原创 2018-04-02 16:18:06 · 136 阅读 · 0 评论 -
贪心算法
对于一个有正有负的整数数组,请找出总和最大的连续数列。 给定一个int数组A和数组大小n,请返回最大的连续数列的和。保证n的大小小于等于3000。测试样例: [1,2,3,-6,1]输出: 10int getMaxSum(vector<int> A, int n) { // write code here //初始状态...原创 2018-04-19 17:28:52 · 143 阅读 · 0 评论 -
迭代和递归
递归: 1. 减而治之: 为求解一个大规模问题,可以将其规划为两个子问题:其一平凡,另一规模缩减 分别求解子问题 由子问题的解,得到原问题的解 数组求和:线性递归 int sum(int A[], int n){ return (n < 1) ...原创 2018-03-29 17:23:25 · 171 阅读 · 0 评论 -
动态规划入门
最长公共子序列(LCS) LCS:递归单调性:无论如何,每经过一次对比,原问题的规模必可减小,具体地,作为输入的两个序列,最少有一个的长度缩短一个单位;最好情况:只需要O(n+m)时间(即只出现减而治之的情况);但问题在于,(在第2种情况下,即出现分而治之)原问题将分解为两个子问题,它们在随后进一步导出的子问题可能雷同。 int findLCS(string A, int...原创 2018-03-22 23:40:03 · 125 阅读 · 0 评论