C++
alxe_made
个人对机器学习、深度学习比较感兴趣。
展开
-
C++判断一棵树是否为BST(二叉排序树、搜索树)
1. 题目给定一棵二叉树,判定该二叉树是否是二叉搜索树(Binary Search Tree)?2. 思路二叉搜索树要求:结点node的左子树所有结点的值都小于node的值。结点node的右子树所有结点的值都大于node的值。结点node的左右子树同样都必须是二叉搜索树假设如图所示二叉树: 10 / \ 5 15 -------- binary t...原创 2019-07-06 15:57:29 · 3309 阅读 · 0 评论 -
C++实现二叉树的序列化和反序列化
1. 题目要求二叉树的序列化和反序列化2. 思路2.1 序列化首先我们介绍二叉树先序序列化的方式,假设序列化的结果字符串为str,初始时str等于空字符串。先序遍历二叉树,如果遇到空节点,就在str的末尾加上“#!”,“#”表示这个节点为空,节点值不存在,当然你也可以用其他的特殊字符,“!”表示一个值的结束。如果遇到不为空的节点,假设节点值为3,就在str的末尾加上“3!”。现在请你...原创 2019-07-06 10:45:45 · 6232 阅读 · 3 评论 -
C++实现字符串拼接找到字典序最小组合问题
1. 题目描述给定一个字符串类型的数组strs,找到一种拼接方式,使得把所有字 符串拼起来之后形成的字符串具有最低的字典序。比如:举例:strs=[“abc”,“de”]。可以拼成"abcde",也可以拼成"deabc",但前者字典顺序更小,所以返回“abcde”strs=[“b”,“ba”]. 可以拼成“bba”和“bab”,后者字典序小,返回后者“bab”2. 思...原创 2019-07-15 16:04:42 · 1678 阅读 · 0 评论 -
C++实现在二叉树中找到一个节点的后继节点
在二叉树中找到一个节点的后继节点1. 题目描述给定一颗二叉树和其中的一个节点,如果找出中序遍历的下一个节点?树中的节点除了有两个分别指向左、右子节点的指针,还有一个指向父节点的指针。已知该二叉树如图所示:2. 思路分为三种情况:一个节点有右孩子,则在中序遍历中,该节点的后继是它的右子树的最左节点。这个节点是它父亲的左孩子,则该节点的后继节点是它的父亲。这个节点...原创 2019-07-05 15:33:58 · 920 阅读 · 1 评论 -
C++实现二叉树的先序、中序、后序遍历,包括递归方式和非递归 方式
C++实现二叉树的先序、中序、后序遍历,包括递归方式和非递归方式。1. 二叉树的基本结构struct Node { int value; Node* left; Node* right; Node(int value): value(value), left(nullptr), right(nullptr) {}};2. 递归和非递归方...原创 2019-07-05 11:02:03 · 15962 阅读 · 1 评论 -
C++设计RandomPool结构
1. 题目要求设计一种结构,在该结构中有如下三个功能:insert(key):将某个key加入到该结构,做到不重复加入。delete(key):将原本在结构中的某个key移除。getRandom(): 等概率随机返回结构中的任何一个key。【要求】 Insert、delete和getRandom方法的时间复杂度都是O(1)O(1)O(1)2. 思路用两个hash表为了得到k...原创 2019-07-09 17:13:46 · 680 阅读 · 4 评论 -
c++实现岛问题(并查集)
1. 问题描述一个矩阵中只有0和1两种值,每个位置都可以和自己的上、下、左、右四个位置相连,如果有一片1连在一起,这个部分叫做一个岛,求一个矩阵中有多少个岛?比如:0 0 1 0 1 01 1 1 0 1 01 0 0 1 0 00 0 0 0 0 0这个矩阵中有三个岛。2. 思路我们的主体是进行二维数组的遍历,同时我们也定义一个感染函数。比如我们遇到一个1时候,我们对这个...原创 2019-07-13 11:23:37 · 1158 阅读 · 0 评论 -
C++判断一个链表是否为回文结构
1. 题目描述(基础要求)给定一个链表的头节点head,请判断该链表是否为回文结构。 例如: 1->2->1,返回true。 1->2->2->1,返回true。15->6->15,返回true。 1->2->3,返回false。2. 思路如果对空间复杂度没有要求的话,我们可以借助辅助空间.我们借助一个STL的stack将我们的va...原创 2019-06-01 16:39:25 · 2983 阅读 · 0 评论 -
C++在行列都排好序的矩阵中找数
1. 题目描述给定一个有N*M的整型矩阵matrix和一个整数K,matrix的每一行和每一 列都是排好序的。实现一个函数,判断K是否在matrix中。 例如: 0 1 2 5 2 3 4 7 4 4 4 8 5 7 7 9 如果K为7,返回true;如果K为6,返回false。时间复杂度为O(N+M),额外空间复杂度为O(1)。2. 问题分析因为这里是行列都排好序了,所以我们不需要整...原创 2019-05-31 11:13:15 · 1054 阅读 · 0 评论 -
C++打印之字形矩阵
打印之字形矩阵1. 题目描述给定一个矩阵matrix,按照“之”字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12“之”字形打印的结果为:1,2,5,9,6,3,4,7,10,11,8,12额外空间复杂度为O(1)O(1)O(1).2. 解题思路这题如果扣下标的关系的话将很难写,会陷入局部关系.但是我们从整体出发思路就会开阔很多.和前面的类似,本...原创 2019-05-31 10:44:26 · 2195 阅读 · 1 评论 -
C++判断一棵树是否为AVL(二叉平衡树)
1. 题目要求判断一棵二叉树是否是平衡二叉树2. 思路AVL树的名字来源于它的发明作者G.M. Adelson-Velsky 和 E.M. Landis。AVL树是最先发明的自平衡二叉查找树(Self-Balancing Binary Search Tree,简称平衡二叉树)。平衡二叉树定义(AVL):它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和右子树的深度之差(平...原创 2019-07-06 16:21:47 · 2107 阅读 · 0 评论 -
C++实现二叉树深度优先搜索(DFS)、广度优先搜索(BFS)
在前面的文章中我们实现了二叉树的深度优先搜索,先序遍历,中序遍历,后序遍历,分别实现了递归和非递归版本。这里我们着重介绍一下广度优先搜索(BFS)1. 基本概念如图所示,BFS为是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。如上图所示的二叉树,A 是第一个访问的,然后顺序是 B、C,然后再是 D、E、F、G。2. 基本思路仔细看看层序遍历过程,其实就是从...原创 2019-07-06 20:18:21 · 7200 阅读 · 0 评论 -
c++实现图的广度优先搜索(BFS)和深度优先搜索(DFS)
1. 基本概念图分为无向图和有向图。与一个顶点相邻接的顶点数叫做该顶点的度。在有向图中,进入一个顶点的弧叫做该顶点的入度,从一个顶点发出的弧叫做该顶点的出度。在无向图中,若图中任意一对顶点都是连通的,则称此图是连通图。在有向图中,若任意一对顶点u和v间存在一条从u到v的路径和从v到u的路径,则称此图是强连通图。无向图的一个极大连通子图称为该图的一个连通分量。有向图的一个极大强连通子...原创 2019-07-18 10:31:04 · 4487 阅读 · 0 评论 -
C++实现统计某个字符在字符串出现的次数,忽略大小写
1. 题目描述写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。输入描述:第一行输入一个有字母和数字以及空格组成的字符串,第二行输入一个字符。输出描述:输出输入字符串中含有该字符的个数。输入:ABCDEFA输出12. 思路这道题直观的思路是可以利用STL的count函数,但是忽略大小写直接套用就...原创 2019-08-16 11:09:44 · 7970 阅读 · 0 评论 -
C++打印一个字符串的全部排列,要求不要出现重复的排列
1. 题目打印一个字符串的全部排列,要求不要出现重复的排列.比如给字符串abc, 那么需要我们输出abc,acb, bac, bca, cab,cba.2. 思路我们主要是借助递归思想.将每个元素都与子数组的第一个元素交换再求剩余部分的全排列求完后再交换会来,复原原数组,这样是防止出现重复元素一开始看网上的代码实在是不知所云,后来去网上找个视频,感觉不错.[算法教程] 全排列...原创 2019-07-20 20:32:41 · 1657 阅读 · 1 评论 -
C++实现一个数据流中,随时可以取得中位数
1. 题目描述Leetcode295: 数据流的中位数中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() -...原创 2019-07-19 17:25:19 · 1136 阅读 · 0 评论 -
C++实现会议安排问题(贪心问题)
1. 题目描述一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲。 给你每一个项目开始的时间和结束的时间(给你一个数组,里面 是一个个具体的项目),你来安排宣讲的日程,要求会议室进行的宣讲的场次最多。返回这个最多的宣讲场次。数学描述:如下图所示我们给定三个数组,图中表示三条线段,线段的两个端点分别代表的是起始时间和终止时间。注意:如果上一个活动在t时间结束,下一个活动最早应...原创 2019-07-19 15:47:32 · 3017 阅读 · 1 评论 -
C++项目最大收益(贪心问题)
1. 题目描述输入: 参数1,正数数组costs; 参数2,正数数组profits;参数3,正数k; 参数4,正数m;costs[i]表示i号项目的花费, profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润) ,k表示你不能并行、只能串行的最多做k个项目 m表示你初始的资金。说明:你每做完一个项目,马上获得的收益,可以支持你去做下一个项目。输出: 你最后获得的最大钱数。2...原创 2019-07-19 11:22:52 · 2517 阅读 · 0 评论 -
c++出现double free or corruption (fasttop)
今天在写图的相关的程序,写着写着就出现了一个问题,如图。1. 问题代码这里我们的目标主要是想要是利用邻接矩阵创建一个图,主要代码主要是参考这篇博客【C++】图的定义及性质#include <iostream>#include <climits>enum GraphKind {DG, UDG, DN, UDN};/* directed graph, undi...原创 2019-07-16 21:39:00 · 19159 阅读 · 1 评论 -
C++实现切金条问题(贪心问题)
1. 题目描述一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为20的金条,不管切成长度多大的两半,都要花费20个铜板。一群人想整分整块金条,怎么分最省铜板?例如,给定数组{10,20,30},代表一共三个人,整块金条长度为10+20+30=60. 金条要分成10,20,30三个部分。如果, 先把长度60的金条分成10和50,花费60 再把长度50的条分成20和30,花费50 一共...原创 2019-07-19 10:06:49 · 1241 阅读 · 0 评论 -
C++ 已知一棵完全二叉树,求其节点的个数
1. 题目要求:时间复杂度低于O(N),N为这棵树的节点个数2. 思路思路:因为满树的节点数2h−12^{h} - 12h−1如果一个节点的右子树的最左节点到达完全二叉树的最后一层,则左子树为满树,节点个数等于左子树的节点数+递归求右子树的节点数+本节点,如果此节点的右子树的最左节点没有到完全二叉树的最后一层,则右子树为满树,节点个数等于右子树的节点数+递归求左子树的节点+本节点。3...原创 2019-07-06 23:09:04 · 870 阅读 · 0 评论 -
C++判断一棵树是否为完全二叉树(CBT)
1. 定义如果一棵深度为k,有n个结点的二叉树中各结点能够与深度为k的顺序编号的满二叉树从1到n标号的结点相对应的二叉树称为完全二叉树。(只有最下两层结点可以度小于2)。需要满足以下二个特征:叶子结点只可能在层次最大的两层上出现;前k-1层中的结点都是“满”的,且第 k 层的结点都集中在左边。2. 思路层序遍历的时候我们都是只把不为空的左右孩子送入队列中,现在我们把层...原创 2019-07-06 21:15:16 · 5955 阅读 · 0 评论 -
C++翻转单向链表
和上题不一样,这题我们需要改单链表的结构了.1.问题描述输入一个链表,反转链表后,输出新链表的表头。2. 解题思路参考剑指offer官方解法3. 代码#include <iostream>struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next...原创 2019-05-30 22:58:17 · 573 阅读 · 0 评论 -
C++实现从头到尾打印链表
1. 题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。2. 解题思路这里仅仅需要打印数值,而不是反转链表,这个还是有区别.如果单纯的反转打印链表的值的话,我们可以使用stack操作.3. 部分代码/*** struct ListNode {* int val;* struct ListNode *next;* ...原创 2019-05-30 22:08:29 · 1935 阅读 · 0 评论 -
C++矩阵顺时针旋转90度
接上题的旋转打印矩阵,本题是将矩阵旋转90度打印1. 题目描述将一个矩阵顺时针旋转90度, 比如给定一个矩阵A:旋转之后为:2. 思路和打印矩阵一样,这里也是从宏观出发,先旋转最外圈的,然后在旋转内圈的正方形. 关于我们旋转一个正方形代码我们只需要找到规律就好了.这里我们直接上代码了.3. 代码#include <iostream>#include <...原创 2019-05-30 16:53:28 · 12456 阅读 · 0 评论 -
C++实现基本排序算法3:直接选择排序
选择排序的基本思想是: 在每一趟排序中,在待排序自表中选出关键字最小或者最大的元素放在其最终的位置。本文主要介绍的是直接选择排序。1. 直接选择排序的基本原理参考文献:经典排序算法 - 选择排序Selection sort2. 代码#include <iostream>#include <vector>void Swap(std::vector&l...原创 2019-03-27 19:53:39 · 964 阅读 · 0 评论 -
C++实现基本排序算法2:冒泡排序和快速排序
交换排序的基本思想是:两两比较呆排列的元素,返现倒序即交换。基于这种思想的有两种排序方法,即冒泡排序和快速排序。1. 冒泡排序和快速排序的基本原理参考文章:c++实现冒泡排序冒泡排序(C/C++ 实现)算法 3:最常用的排序——快速排序白话经典算法系列之六 快速排序 快速搞定2. 参考代码#include <iostream>#include <vect...原创 2019-03-27 15:55:36 · 757 阅读 · 0 评论 -
C++实现基本排序算法1:插入排序和希尔排序
用C++简单的实现插入和希尔排序,也算是一个笔记吧~1. 插入排序和希尔排序的原理“深入理解”—插入排序算法白话经典算法系列之二 直接插入排序的三种实现白话经典算法系列之三 希尔排序的实现2.代码#include <iostream>#include <vector>void Swap(std::vector<int>&, in...原创 2019-03-27 10:21:16 · 371 阅读 · 0 评论 -
C++学习笔记7--函数模板
函数模板是通用的函数描述,也就是说他们可以使用泛型来定义函数,其中的泛型可以是具体的类型(比如int ,double类型)。通过将类型作为参数传递给模板,可以使得编译器生成该类型的函数。比如我们已经定义了交换二个int值的函数,这个时候我们想要扩展为交换二个double类型的数据,甚至是交换二个class实例,普通的方法就是重新定义这些函数,但是函数模板提供这样一种机制,可以让我们使用一套通...原创 2018-08-16 12:27:51 · 214 阅读 · 0 评论 -
C++的学习笔记8--array、vector以及可变数组
在c++11中,STL中我们提供了三种类型的数组,一种是std::array,一种是std::vector以及可变数组,这和传统的c语言相比多了很多功能,下面逐一介绍他们的功能以及使用方法。1. array的使用 array静态数组大小在定义时固定,位于栈上。std::array是在C++11中才引入的,与内置数组相比,array是一种更安全、更容易使用的...原创 2018-08-18 10:45:45 · 3894 阅读 · 0 评论 -
C++学习笔记1--命名空间的使用
之前在学习C++的时候,一直没有深入了解命名空间的相关事宜,这里重新学习一下C++的命名空间1. C语言的缺陷1.1 全局变量引用问题:定义二个文件: main.c int a = 10int main(){ return 0;}test.c int a = 11;出现错误: 分析: 因为这里定义的int a = 10;是一个全局变量,...原创 2018-08-08 17:50:12 · 502 阅读 · 0 评论 -
C++学习笔记5--引用的简单使用方法
&nbsp;&nbsp;C++11新增了一个复合类型–引用变量。引用是已经定义的变量的别名,引用变量的主要用途的是作用于函数的形参,通过引用变量作用参数,函数将用于原始数据,而不是副本。这样除了指针之外,引用可以为函数处理大象结构提供一种方便的途径,同时对于设计类来说,引用也是必不可少的。 – 摘自《C++ prime 第六版》1. 引用的定义int rats;int &...原创 2018-08-11 18:06:20 · 177 阅读 · 0 评论 -
C++学习笔记6--枚举类型
C++的enum工具提供了另一种创建符号常量的方式,这种方式可以代替const。1. C语言的的枚举类型我们可以使用关键字enum ,比如定义一个颜色的枚举类型, enum color { red, blue, yellow }; 枚举类型变量内容必须是整数类型, 默认是从0开始的,不允许是浮点类型。但是我们可以给变量赋值,然后之后的值加一...原创 2018-08-14 14:36:09 · 189 阅读 · 0 评论 -
C++学习笔记4--左值和右值、const、new和delete
1. 左值和右值 C/C++语言中可以放在赋值符号左边的变量,即具有对应的可以由用户访问的存储单元,并且能够由用户去改变其值的量。或者说左值是代表一个内存地址值,并且通过这个内存地址,就可以对内存进行读并且写(主要是能写)操作;这也就是为什么左值可以被赋值的原因了。相对应的还有右值:当一个符号或者常量放在操作符右边的时候,计算机就读取他们的“右值”,也就是其代表的真实值。简单来说就是,左值...原创 2018-08-09 17:11:30 · 662 阅读 · 0 评论 -
C++学习笔记3--auto、typeid、decltype使用
C++11新增了一个工具,让编译器可以根据初始值的类型推断变量的类型,为此它重新定义了auto的含义。#include&amp;lt;iostream&amp;gt;#include&amp;lt;stdlib.h&amp;gt;//自动变量,自动获取类型,输出,泛型void main(){ auto num = 10;//自动变量,自动匹配类型 auto numA = 10/3.0;...原创 2018-08-09 07:59:25 · 1686 阅读 · 0 评论 -
C++实现基本排序算法4:归并排序
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。1. 归并排序的基本原理归并排序(基于顺序容器vector_递归;基于数组array_递归_非递归)C++ Merge sort(归并排序)C+...原创 2019-03-27 21:41:58 · 1781 阅读 · 0 评论 -
C++实现对数器
看了左神的视频课,提出了一种很好的小tips:对数器。对数器是用来测试代码正确性的,我们在找不到合适的oj系统测试自己的代码时,可以自己写一个对数器对代码进行测试。奈何左神是用java编写的对数器,虽然语言不重要,算法才是王道,但是根据实际需要我还是选择用c++编写程序,因此也就需要一个对数器了。1. 对数器简单介绍1.有一个你要测的方法a;2.实现一个绝对正确即使复杂度不好的方法b;...原创 2019-04-26 17:35:34 · 2508 阅读 · 1 评论 -
c++实现数组小和
1. 问题描述数组小和的定义如下:例如,数组s=[1,3,5,2,4,6],在s[0]的左边小于或等于s[0]的数的和为0,在s[1]的左边小于或等于s[1]的数的和为1,在s[2]的左边小于或等于s[2]的数的和为1+3=4,在s[3]的左边小于或等于s[3]的数的和为1,在s[4]的左边小于或等于s[4]的数的和为1+3+2=6,在s[5]的左边小于或等于s[5]的数的和为1+3+5+2...原创 2019-04-27 21:21:14 · 802 阅读 · 0 评论 -
C++实现转圈打印矩阵
给定一个整型矩阵 matrix,请按照转圈的方式打印它。1. 题目描述例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16打印结果为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10要求额外空间复杂度为O(1).2. 思路分析先打印最外圈,然后打印里面的一圈.只要设计出...原创 2019-05-30 16:11:38 · 1355 阅读 · 0 评论 -
C++用两个栈实现队列
1. 基础队列:先进先出,即插入数据在队尾进行,删除数据在队头进行;栈:后进先出,即插入与删除数据均在栈顶进行。2. 思路两个栈实现一个队列的思想:用pushStack栈作为push数据的栈,用popStack栈作为pop数据的栈。只要是对队列进行push操作,就将数据push入pushStack栈中。要实现队列的pop操作,有二点原则,如果popStack为空的话那...原创 2019-05-06 16:53:27 · 1467 阅读 · 0 评论