![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 64
聂炳玉
不断学习,不断提升
展开
-
字符串相乘
一、前言问题来源LeetCode问题链接:https://leetcode-cn.com/explore/interview/card/bytedance/242/string/1015/二、题目给定两个以字符串形式表示的非负整数num1和num2,返回num1和num2的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 = "2", num2 = "3"输出: "6"示例2:输入: num1 = "123", num2 = "456...原创 2020-06-13 17:24:28 · 222 阅读 · 0 评论 -
字符串的排列
一、前言问题来源LeetCode问题链接:https://leetcode-cn.com/explore/interview/card/bytedance/242/string/1016/二、题目给定两个字符串s1和s2,写一个函数来判断s2是否包含s1的排列。换句话说,第一个字符串的排列之一是第二个字符串的子串。示例1:输入: s1 = "ab" s2 = "eidbaooo"输出: True解释: s2 包含 s1 的排列之一 ("ba").示例...原创 2020-06-09 23:52:08 · 948 阅读 · 0 评论 -
无重复字符的最长子串
一、前言问题来源LeetCode问题链接:https://leetcode-cn.com/explore/interview/card/bytedance/242/string/1012/二、题目给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",...原创 2020-06-09 21:47:36 · 192 阅读 · 0 评论 -
十大经典排序
一、前言排序在算法和数据结构中很常见,对常见排序算法进行归纳。二、概述2.1 算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。2.2 算法复杂度2.3 相关概念稳定:如果a原本在b前面,而a=b,排序之后a仍然...原创 2020-06-01 20:49:51 · 614 阅读 · 2 评论 -
柱状图中最大的矩形多种解法
一、前言问题来源LeetCode 84,难度:困难问题链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/二、题目给定n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。示例:以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为[2,1,5,6,2,3]。图中阴影部分为所能勾勒出的最大矩形面积,...原创 2020-05-23 20:18:46 · 4226 阅读 · 2 评论 -
二叉树中的最大路径和
一、前言里面来源LeetCode 124,难度:困难问题链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/二、题目给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。示例 1:输入: [1,2,3] 1 / \ 2 3输出: 6示例 2:输入: [-10,.原创 2020-05-19 23:42:15 · 516 阅读 · 0 评论 -
二叉搜索树序列
一、前言里面来源LeetCode,难度:困难问题链接:https://leetcode-cn.com/problems/bst-sequences-lcci/二、题目从左向右遍历一个数组,通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。给定一个由不同节点组成的二叉树,输出所有可能生成此树的数组。示例:给定如下二叉树 2 / \ 1 3返回:[ [2,1,3], [2,3,1]]三、题意分析..原创 2020-05-19 21:46:10 · 1031 阅读 · 0 评论 -
乘积最大子数组
一、前言回顾前文《最大子数组》,求解的是最高点到最低点差值,后经转换为累加和最大的子数组。对这个问题再扩展一下,将加给为乘,连续乘积最大的数组怎样求解呢?《最大子数组》https://blog.csdn.net/nie2314550441/article/details/106036517二、题目给你一个整数数组 nums,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4]输出: 6解释..原创 2020-05-19 08:47:25 · 378 阅读 · 0 评论 -
二叉树镜像判断
一、前言《二叉树的镜像》在验证二叉树是互为镜像时,给出了三种方法,本文对这三种方法进行说明二、题目判断两颗二叉树是否互为镜像。三、思路三种解决方法:方法一,将其中一颗二叉树转为镜像,并与另外一棵树进行比较判断各节点值是否相等方法二,互为镜像的两个二叉树,每层数据顺序相反,逐层判断即可,需要注意结点为空的情况。前面文章中《从上往下打印二叉树》给出了获得逐层获得树数据方法。方法三:递归实现——树1左结点和树2右结点判断;树1右结点和树2左结点判断。三种方法特...原创 2020-05-18 11:47:57 · 2735 阅读 · 0 评论 -
二叉树的镜像
一、前言《剑指Offer》中题27二、题目请完成一个函数,输入一棵二叉树,该函数输出它的镜像。叉树节点的定义如下:三、思路递归实现即可四、扩展给两棵二叉树,判断是否互为镜像二叉树?结合本文不难得出两个解决方法:解决方法一,将其中一颗二叉树转为镜像,并与另外一棵树进行比较判断各节点值是否相等解决方法二,本文《五、编码实现》测试用例中判断两颗树是否为镜像已经给出了解决方案。五、编码实现// MirrorOfBinaryTree.h#p...原创 2020-05-17 23:15:49 · 308 阅读 · 0 评论 -
树的子结构
一、前言继续树相关的问题二、题目输入两棵二叉树A和B,判断B是不是A的子结构。三、思路递归实现即可四、编码实现之前创建树是通过前序遍历和中序遍历来重建树,这种方法要求不能有相同的值。树的子结构需要考虑有相同的结点值。新增一直构造树的方法,类似组合模式。当前提供了三种构建树方法。// ConstructTree.h#pragma once#include <exception>#include "Common.h"///////////...原创 2020-05-16 12:54:29 · 173 阅读 · 0 评论 -
二叉树中和为某一值的路径
一、前言继续树相关的问题二、题目输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。三、思路用递归解决,简单直观。需要注意状态恢复。在每次调用完递归之后,怎样恢复到当前结点状态,例如 A 中执完左结点搜索,准备进行右结点搜索,此时需要保证容器(用于记录路径)中记录的结点和左搜索时是一样的。有两种方法:方法一,每次进行赋值即可。理解方便,但是会进行多次赋值操作方法二,使用引用,递..原创 2020-05-15 23:54:10 · 345 阅读 · 0 评论 -
二叉树的下一个结点
一、前言继续树相关的问题二、题目给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左、右子节点的指针,还有一个指向父节点的指针。三、思路中序遍历顺序:左 - 中 - 右1、若该节点有右子节点,则下一个节点为右节点集合中的第一个结点。例如下面实体:e 下一个结点是 i;a 下一个结点是 f;2、若该节点无右节点,则需往上查找直到当前节点为父节点的左子结点。例如下面实体:h 是父节点(e)的左子结点,即:h ..原创 2020-05-15 23:02:43 · 266 阅读 · 2 评论 -
二叉树的深度
一、前言继续树相关的问题二、题目输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依沙经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为极的深度。四、思路用递归解决,简单直观五、编码实现// TreeDepth.h#pragma once#include <iostream>#include "Common.h"#include "ConstructTree.h"using namespace std;#define ...原创 2020-05-14 23:06:11 · 146 阅读 · 0 评论 -
按之字顺序打印二叉树
一、前言前文《上往下打印二叉树》是从上往下,从左往右打印,扩展一下这个问题,按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推,该怎样打印呢?二、题目按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推三、思路先回顾一下前文《上往下打印二叉树》,用一个队列来实现的,队列是先进先出,正好满足从左往右打印树。队列我们可以看着是一..原创 2020-05-14 12:57:17 · 352 阅读 · 0 评论 -
上往下打印二叉树
一、前言前文《直观的打印树结构》完成了树结构打印,《重建二叉树》完成了二叉树的创建,接下来需要上往下打印二叉树《直观的打印树结构》https://blog.csdn.net/nie2314550441/article/details/106066834《重建二叉树》https://blog.csdn.net/nie2314550441/article/details/106088108二、题目一:从上往下打印出二叉树的每个节点,不含空节点。二:从上往下打印出二叉树的每个节点。包.原创 2020-05-13 00:19:23 · 407 阅读 · 1 评论 -
重建二叉树
一、前言前文《直观的打印树结构》已经完成了树结构打印,接下来需要一颗二叉树,那就重建一颗二叉树。二、题目输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。不含相同的节点值。三、知识点回顾先回顾一下树的几种遍历方式:前序遍历:先访问根结点,再访问左子结点,最后访问右子结点。 中序遍历:先访问左子结点,再访问根结点,最后访问右子结点。 后序遍历:先访问左子结点,再访问右子结点,最后访问根结点。四、思路前序遍历,第一个值为当前根节点,对应找到它在中序遍历...原创 2020-05-12 23:48:01 · 223 阅读 · 0 评论 -
直观的打印树结构
屏幕中输出一棵树,为后续和树相关的问题做准备。#include <iostream>#include <iomanip>#include <vector>#include <map>using namespace std;int gDataWidth = 2; // 数据宽度int gChildNodeWidth = 2; // 子节点宽度int gUncleNodeWidth = 3; // 叔节点宽度原创 2020-05-12 00:49:04 · 1308 阅读 · 0 评论 -
一个有趣多种解法的问题
一、前言《算法导论》第四章 分治策略 ,4.1最大子数组问题二、题目有一只股票你被准许可以在某个时刻买进一股该公司的股票,并在之后某个日期将其卖出,买进卖出都是在当天交易结束后进行。为了补偿这一限制,你可以了解股票将来的价格。你的目标是最大化收益。下图4-1给出了17天内的股票价格。三、思路有三种解法:解法一:《算法导论》书中解法。我们的目的是寻找一段日期,使得从第一天到最后一天的股票价格净变值最大。因此,我们不再从每日价格的角度去看待输入数据,而是考察每日价格变化,第.原创 2020-05-10 15:18:02 · 1431 阅读 · 0 评论 -
打印1到最大的n位数
一、前言《剑指Offer》中题17二、题目输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。三、思路有两种解题方法。方法一:数字用字符串保存,每次+1,并打印,+1当前位等于10先前进一位。方法二:没一位数字都用0-9组成,可以使用递归四、注意事项需要考虑是否可以用基本数据类型表示该数,如...原创 2020-04-29 20:26:14 · 260 阅读 · 0 评论 -
顺时针打印矩阵
一、前言《剑指Offer》中题29二、题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16则依次打印出数字 1,...原创 2020-04-28 21:33:54 · 253 阅读 · 0 评论 -
剪绳子(动态规划、贪心算法)
一、前言《剑指Offer》中题14二、题目给你一根长度为n的绳子,请把绳子剪成m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0] X k[1] X ... X k[m]。可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。三、思路第一...原创 2020-04-27 22:07:34 · 3627 阅读 · 1 评论 -
机器人的运动范围
一、前言《剑指Offer》中题13二、题目地上有一个m行和n列的方格。一个机器人从坐标(0,0)的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少...原创 2020-04-25 20:11:59 · 314 阅读 · 0 评论 -
矩阵中的路径
一、前言《剑指Offer》中题12二、题目请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如在下面的3x4的矩阵中包含一条字符串"bcced"的路径(路径中的字母用斜体表示)。但是矩阵中不包含"a...原创 2020-04-25 18:36:21 · 604 阅读 · 0 评论 -
矩形覆盖
一、前言《跳台阶》另一个变形形式。二、题目我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?三、思路竖着放相当于向前+1,横着放一次需要放2个相当于向前+2,那矩形覆盖问题等价于《跳台阶·六、扩展2》和青蛙跳台阶解法一样四、编码实现略,参考《跳台阶》六、扩展2。https://...原创 2020-04-25 11:42:22 · 152 阅读 · 0 评论 -
斐波那契数列(递归、循环、矩阵)三种解法
一、前言《剑指Offer》中题10二、题目写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。三、思路推导公式如下:3.1 三种解法方法一: 递归解法优点:结构简单一目了然。缺点:递归深度随n增大而增大,大量重复计算,效率低下方法二:循环解法优点:计算效率高,结构简单缺点:递推理解复杂方法三:基于矩阵乘法优点:计...原创 2020-04-24 23:38:23 · 5101 阅读 · 0 评论 -
栈的压入、弹出序列
一、前言《剑指Offer》中题31二、题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列{1,2,3,4,5}是某栈的压栈序列,序列{4,5,3,2,1}是该压栈序列对应的个弹出序列,但{4,3,5,1,2}就不可能是该压栈序列的弹出序列。三、思路用一个栈模拟将队列1中的数据压人和根据队列...原创 2020-04-23 23:30:04 · 363 阅读 · 0 评论 -
包含min函数的栈
一、前言《剑指Offer》中题30二、题目定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是0(1)。三、思路定义两个栈。一个数据栈:用于入栈和出栈;一个辅助栈:数据栈入栈时,如果 入栈的数据 < 辅助栈栈顶数据(或者辅助栈没有数据),辅助栈添加入栈的数据,反之辅助栈添加自己栈...原创 2020-04-23 21:29:46 · 291 阅读 · 0 评论 -
用两个栈实现队列
一、前言《剑指Offer》中题9二、题目用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。三、思路队列是先进先出,栈的是先进后出。同一组数据连续执行两次先进后出之后再出栈就可以实现队列的先进先出。实现流程:1.数据进入队列,会将数据压入栈1里面2....原创 2020-04-22 23:48:35 · 2814 阅读 · 0 评论 -
字符串的排序(全排序)
一、前言《剑指Offer》中题38二、题目输入一个字符串,打印出该字符串中字符的所有排列。例如,输入字符串abc,则打印出由字符a、 b、c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。三、思路递归过程:1. 从起始位置往后循环,起始位置的字符和后面字符对换;2. 递归该过程;3. 起始位置的字符和后面字符对换回来。递归...原创 2020-04-21 22:59:17 · 3806 阅读 · 0 评论 -
替换空格
一、前言《剑指Offer》中提五二、题目请实现一个函数,将一个字符串中的空格替换成“%20”。例如,输入"We Are Happy.",则输出 “We%20Are%20Happy.”。三、思路方法一:从头到尾遍历,简单但效率不高,时间复杂度尾O(n^2)方法二:先计算输出长度在满足条件下,从后往前遍历,时间复杂度O(n)四、注意输入条件是否...原创 2020-04-21 21:36:25 · 222 阅读 · 0 评论 -
背包问题先记录一下
#include "stdafx.h"#include #include #include #include #include #include using namespace std;const int c = 10; //背包的容量 const int w[] = { 0, 2, 2, 6, 5, 4 };//物品的重量,其中0号位置不使转载 2016-03-05 09:40:36 · 471 阅读 · 0 评论 -
C++栈(stack)
栈:栈是一种数据结构,存储以及查找数据时只能访问栈的一端。栈后进先出(LIFO, last in first out)栈的操作包括:Clear() ——清空栈IsEmpty()——判断栈是否为空Push(el)——将元素el放到栈的顶部Pop——弹出栈顶部的元素TopEL()——获取栈顶部的元素,但不删除该元素一、栈的向量实现,直接代码Stack.h//原创 2016-03-04 00:58:17 · 721 阅读 · 0 评论 -
C++链表(single-linked list)
直接代码,代码是最好的说明//IntSLList.h#ifndef INTSLLIST_H#define INTSLLIST_Hclass IntSLLNode{public: IntSLLNode() { data = 0; next = 0; } IntSLLNode(int el, IntSLLNode* ptr = 0) { data = el;原创 2016-03-03 16:08:16 · 1398 阅读 · 0 评论 -
全排序(All Rangled)
全排序:从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列如1,2,3三个元素的全排列为:1,2,31,3,22,1,32,3,13,1,23,2,1共3*2*1=6种公式:全排列数f(n)=n!(定义0!=1)1.1递归方法求解(不考虑重复原创 2016-02-26 16:37:21 · 503 阅读 · 0 评论 -
排序——快速排序(quick sort)
快速排序(quick sort):通过一趟排序将要排序的数据分割成独立的两个部分,其中一个部分的所以数据都比另外一部分的所有数据都要小。时间复杂度:O(nlgn)实例:(边界值,选择数组的第一个元素作为边界值)#include "stdafx.h"#include using namespace std;templatevoid QuickSort(T data[], con原创 2016-02-25 18:53:24 · 488 阅读 · 0 评论 -
重建二叉树——输入前序、中序遍历构建二叉树并输出后序遍历
重建二叉树(轻量级)输入某二叉树的前序遍历和中序遍历的结果,重新建立该二叉树。假设输入的前序遍历和中序遍历的结果都不含重复的数字。//输入某二叉树的谦虚遍历和中续遍历的结果,重新简历该二叉树。//假设输入的前序遍历和中续遍历的结果中都不含重复的数字// 前提:前序遍历*p1、中序遍历*p2是正确的// by nby#includeusing namespace原创 2015-03-22 14:48:51 · 633 阅读 · 0 评论 -
输入前序遍历和中序遍历输出后序遍历——在构树和不构树两种情况下输出结果
#includeusing namespace std;struct BinaryTreeNode{int m_nvalue;BinaryTreeNode *m_pLeft;BinaryTreeNode *m_pRigt;};BinaryTreeNode* ConstructCore(int *startpreorder, int *endpreor原创 2015-03-25 20:48:08 · 531 阅读 · 0 评论 -
反转链表
代码:// by nby#includeusing namespace std;struct node{int data;node *next;};// 创建链表 无头节点node *Create(){node *head = new node;node *pp = head;int data[] = { 2, 4, 6, 8原创 2015-03-22 16:20:26 · 310 阅读 · 0 评论 -
排序——插入排序(insertionsort)
插入排序:有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,原创 2016-02-24 13:14:06 · 431 阅读 · 0 评论