![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 52
云治
这个作者很懒,什么都没留下…
展开
-
经典算法之动态规划
动态规划:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解; 对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,让以后再次遇到时直接引用答案,不必重新求解。 适合用动态规划来解决的问题,都具有下面三个特点:最优化原理、无后效性、有重叠子问题。经典题:斐波那契、求最长回文子串、求最长回文子串给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = "babad"输出:"bab"解释:"ab...原创 2022-01-24 18:23:27 · 353 阅读 · 0 评论 -
go实现的经典排序算法
冒泡排序/选择排序/直接插入/归并排序/快排package mainimport "fmt"func swap(arr *[]int, m,n int){ temp := (*arr)[m] (*arr)[m] = (*arr)[n] (*arr)[n] = temp}// 冒泡排序//外层循环是比较的趟数,内层循环是每一趟冒泡:比较相邻的两个数,交换较小者在前,使最小者慢慢浮上来func bubbleSort(arr *[]int){ length := len(*arr原创 2022-01-23 20:11:43 · 353 阅读 · 0 评论 -
经典算法之分治
分治:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,该问题的规模缩小到一定的程度就可以容易地解决,这些子问题互相独立且与原问题形式相同,以便各个击破,分而治之。分治法一般算法框架(伪代码)Divide-and-Conquer§1. if |P|≤n02. then return(ADHOC§) 3. 将P分解为较小的子问题 P1 ,P2 ,…,Pk 4. for i=1 to k 5. do yi = Divide-and-Conquer(Pi) //递归解决Pi原创 2022-01-19 15:40:02 · 1178 阅读 · 0 评论 -
经典算法之回溯
解决一个回溯问题,实际上就是一个决策树的遍历过程。路径:也就是已经做出的选择。 选择列表:也就是你当前可以做的选择。 结束条件:也就是到达决策树底层,无法再做选择的条件。遍历当前可选择的项,在递归调用之前做选择,在递归调用之后撤销选择回溯算法的框架:result = []def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 做...原创 2022-01-19 15:13:08 · 307 阅读 · 0 评论 -
剑指offer 二叉树相关 Go实现
package jianzhiimport ( "container/list" "fmt")type TreeNode struct { Val int Left *TreeNode Right *TreeNode}func levelOrder(root *TreeNode) []int { if root == nil{ return []int{} } var queue = list.New() .原创 2022-01-17 18:02:08 · 266 阅读 · 0 评论 -
剑指 链表相关
剑指offer中链表相关的题目,go实现原创 2022-01-12 19:36:43 · 160 阅读 · 0 评论 -
GoDS简单使用
嘻嘻 发现一个好东西:https://github.com/emirpasic/gods类似于C++的STL容器,使用GO语言封装了多种基础的数据结构,包括set/tree/list/map/stack,以及迭代器等,接下来挑几个常用的进行使用示范,最全的文档还是来自官网readmearraylistarraylist的数据结构非常简单,使用interface类型接收所有类型的value,并且会返回interface类型:type List struct { eleme..原创 2021-10-13 16:48:24 · 997 阅读 · 0 评论 -
剑指刷题 全排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母解题思路:将字符串看成两部分 第一部分是一个字符,整下的部分 再全排列。然后将剩余每个元素 与第一个字符交...原创 2019-08-07 14:10:12 · 79 阅读 · 0 评论 -
剑指刷题 复制一个复杂链表
复杂链表的数据元素 包括 数据域 next域 一个随机域,随机也是指向这个链表中的任一个结点。解题思路是:从头到尾 遍历的同时 复制链表结点,在复制链表结点的时候 只能 暂时根据原链表复制出 数据域 和next指针域,随机指向的结点,不一定已经复制出新结点。 所以在这个同时 将 原链表每个结点的地址(使用数组arr1),以及新链表每个结点的地址(使用数组arr2) 保存下来,等到 全...原创 2019-08-06 20:26:02 · 111 阅读 · 0 评论 -
剑指刷题 定义一个栈
使用数组 ,构建一个栈的数据结构, 实现 栈的push pop min top ,#include <vector>class Solution {public: void push(int value) { if(top_num<stack.size()) { stack[top_num]=va...原创 2019-08-06 19:18:06 · 95 阅读 · 0 评论 -
剑指刷题 机器人的运动
题目描述地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?解题思路:用回溯法,如果当前格子可...原创 2019-08-08 22:43:56 · 173 阅读 · 0 评论 -
剑指刷题 构建乘积数组
题目描述给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。解题思路:不能使用乘法,就用B[i]=C[i]*D[i]C[i]=C[i-1]*A[i-1]D[i]=D[i+1]*A[i+1]C[0]=1D[0]=1...原创 2019-08-02 15:01:55 · 81 阅读 · 0 评论 -
剑指刷题 查找数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。解题思路:第一种方法 就是暴力遍历 第二种方法是 首先判断 arr[0]==0如果不是 让0 下标和a...原创 2019-08-02 11:28:22 · 107 阅读 · 0 评论 -
剑指刷题 滑动窗口内的最大值
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6]...原创 2019-08-08 17:14:55 · 77 阅读 · 0 评论 -
剑指刷题 圆圈中最后剩下的数字
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去.....原创 2019-08-02 10:40:31 · 90 阅读 · 0 评论 -
剑指刷题 扑克牌顺子
题目:输入一个数组 判断数组中的数字是不是连续的数字,并且 0 可以代表任何数。解题思路: 先对数组排序,然后判断数组是不是按照+1递增,并且把0可以代替任何数的情况加入到判断中。、class Solution {public: bool IsContinuous( vector<int> numbers ) { int len=numbers.s...原创 2019-08-02 09:44:44 · 114 阅读 · 0 评论 -
牛客刷题 写pow函数
解题思路:指数分为 正数 0 负数class Solution {public: double Power(double base, int exponent) { if(exponent>0) { double res=1; for(int i=0;i<exponent;++i)...原创 2019-07-28 21:10:42 · 248 阅读 · 0 评论 -
剑指刷题 数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。解题思路:使用set 存放数据流中的数据,set会自行排序,我只需要在拿中位数的时候做判断,如...原创 2019-08-08 14:54:26 · 92 阅读 · 0 评论 -
剑指刷题 求1--n整数中 1出现的个数
题目描述求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。解题思路 :我的思路时间复杂度 比较大 从 1 一直遍历到 n,然...原创 2019-08-07 17:16:15 · 132 阅读 · 0 评论 -
二叉树的子结构
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)第一种方法是使用递归的思想, 第一步通过递归找到 跟子树根节点相同的 结点,找到后 调用 函数chen,再依次递归比较每一个 结点 是否相等。 这种递归的时间复杂度 太高了 ,在牛客上运行不过去。class Solution {public: bool HasSubt...原创 2019-08-14 16:31:26 · 125 阅读 · 0 评论 -
二叉排序树
bool is_bstree(treenode * root) { if (root == NULL) { return true; } queue<treenode * > q; q.push(root); while (!q.empty()) { root = q.front(); q.pop(); if (root-&...原创 2019-08-17 14:41:25 · 80 阅读 · 0 评论 -
排序
堆排特点: 使用数组模拟完全二叉树的顺序存储,大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]堆排步骤:(假设我们想要升序的排列)第一步:先n个元素的无序序列,构建成大顶堆第...原创 2019-08-20 15:51:13 · 115 阅读 · 0 评论 -
剑指刷题 二叉树的序列化与反序列化
题目描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍...原创 2019-08-20 11:51:44 · 127 阅读 · 0 评论 -
剑指刷题 把二叉树按照行打印
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。解题思路:使用 层次遍历的方法,将 树的节点类型进行再封装, 成员变量包含树的节点,和该结点处于 树的第几层, 根节点算第1层然后层次遍历时 根据 该结点 的层 来决定 压入二维数组的哪一维。/*struct TreeNode { int val; struct TreeNode...原创 2019-08-14 22:25:18 · 368 阅读 · 0 评论 -
剑指刷题 对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路: 先复制一个相同的 二叉树出来, 然后将新的二叉树 转成 其镜像, 判断两个二叉树是不是相等。 使用层次遍历的方法。/*struct TreeNode { int val; struct Tre...原创 2019-08-14 21:49:55 · 128 阅读 · 0 评论 -
剑指刷题 找二叉树中某个结点 在中序遍历中的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。/*struct TreeLinkNode { int val; struct TreeLinkNode *left; struct TreeLinkNode *right; struct TreeLinkN...原创 2019-08-14 20:46:35 · 253 阅读 · 0 评论 -
关于二叉树
#include <queue>#include <list>#include <iostream>using namespace std;typedef struct treenode { char val; struct treenode *left; struct treenode *right; treenode(char x) :...原创 2019-08-10 15:31:02 · 178 阅读 · 0 评论 -
剑指刷题 二叉树中和为某个整数的 所有路径
题目描述输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)解题思路:按照 回溯法的思路,遍历每一条路径,并记录路径 与路径之和,如果遍历到叶子结点 ,路径之和不等于期望的数字,那么 放弃这条路径,回到 上一根节点,选择另一条路径。...原创 2019-08-14 17:45:18 · 90 阅读 · 0 评论 -
剑指刷题 二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5...原创 2019-08-14 17:05:10 · 81 阅读 · 0 评论 -
剑指刷题 二叉搜索树
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解题思路:后序遍历 的根节点在数组的最后一个,并且可以将数组分成两部分,第一部分是左子树的后序遍历结果,都小于根节点,第二部分是右子树的后序遍历结果都大于根节点,那么遍历这个数组,如果在第二部分中遇到比根节点小的 那就不是二叉搜索树。...原创 2019-08-19 18:18:15 · 95 阅读 · 0 评论 -
剑指刷题 和为S的两个数 和为S的连续正数序列
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。解题思路 首先把 和为sum的全部保存在 容器中,方法是从最小和最大的开始加和比较,如果加和大于sum,那让 最大的下标往小(左)移动,如果加和小于sum,让最小的下标 往大(右)移动。全部存到容器后,再拿出来比较乘积,将乘积最小的两个数 放到...原创 2019-08-01 22:43:22 · 75 阅读 · 0 评论 -
牛客刷题 求一个整数中 二进制表示法中1 的个数
剑指offer的解题思路:class Solution {public: int NumberOf1(int n) { int count =0; while(n) { ++count; n=(n-1)&n; } ...原创 2019-07-28 17:21:25 · 154 阅读 · 0 评论 -
牛客刷题 斐波那契数列的第N项
三种解题思路:1 是递归 空间复杂度比较高2 用一个数组保存 用循环将前N项的斐波那契 算出来,存到数组中 返回arr[N]3 用三个数 第0个数 是0 第1个数是1 第三个数是前两个数之和,然后使用循环加赋值的方法 拿到第N个数。//第一种:class Solution {public: int Fibonacci(int n) { if(n...原创 2019-07-28 16:26:30 · 202 阅读 · 0 评论 -
牛客刷题 不用四则运算做加法 不用循环判断和乘除 做1+2+……+n
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。class Solution {public: int Add(int num1, int num2) { int sum,carry;//记录总和 (不带进位 ) 和进位 do{ sum=num1^num2; //记...原创 2019-08-01 09:04:07 · 156 阅读 · 0 评论 -
牛客刷题 栈的压入弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)解题 思路:两个迭代器 p q分别指向 压入序列的 首 和 弹出序...原创 2019-07-31 20:04:00 · 127 阅读 · 0 评论 -
牛客刷题 表示数值的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。解题思路数值正确的规范应该是 分为三部分 第一部分可以是正负号 数字 以及 点组成 第二部分是 E 或者 e 第...原创 2019-07-31 19:56:37 · 106 阅读 · 0 评论 -
牛客刷题 判断两个单链表是否相交
/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/#include <stack>class Solution {public: ListNode* FindFirstCommonNode( ListNode* ...原创 2019-07-26 20:21:24 · 298 阅读 · 0 评论 -
牛客刷题 字符流中第一个不重复的元素
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。解题思路:用两个list ,listA保存字符流中的所有元素,另一个listB保存不重复的字...原创 2019-07-31 16:15:14 · 108 阅读 · 0 评论 -
剑指刷题 第一个只出现一次的字符
解题思路:第一种方法:暴力遍历,固定一个字符,在整个范围内搜索 看看有没有跟它一样的,如果没有 那么输出它。class Solution {public: int FirstNotRepeatingChar(string str) { int len=str.length(); int i,j; for( i=0;i<len...原创 2019-08-03 11:50:49 · 83 阅读 · 0 评论 -
剑指刷题 求连续子数组的最大和
解题思路:第一种 暴力遍历,将所有子数组的和都求出来 ,然后返回其中的最大值。class Solution {public: int FindGreatestSumOfSubArray(vector<int> array) { int len = array.size(); int max,j,i,num; for (i = 0,...原创 2019-08-03 11:15:18 · 125 阅读 · 0 评论