自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 算法 - 二分查找的三种框架/模式

一、查找某个元素的位置,不存在返回-1:class Solution {public: int search(vector<int>& nums, int target) { //采用基础框架 int left = 0, right = nums.size()-1; while(left <= right){ int mid = left+(right-left)/2;

2020-07-16 15:08:44 238 1

原创 刷题 - 三角形最小路径和

问题描述:给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。 [2], [3,4], [6,5,7], [4,1,8,3]自顶向下的最小路径和为11(即,2+3+5+1= 11)。//自底向上class Solution {public: int minimumTotal(vector<vec...

2020-07-08 10:12:26 130

原创 刷题 - 旋转链表

题目:给定一个链表,旋转链表,将链表每个节点向右移动k个位置,其中k是非负数。示例1:输入: 0->1->2->NULL, k = 4输出: 2->0->1->NULL解释:向右旋转 1 步: 2->0->1->NULL向右旋转 2 步: 1->2->0->NULL向右旋转 3 步:0->1->2->NULL向右旋转 4 步:2->0->1->...

2020-07-07 20:21:24 171

原创 算法 - 7大比较类排序算法程序设计

典型的7大排序算法典型的7大排序算法包括:(1)冒泡排序(2)选择排序(3)插入排序(4)希尔排序(5)归并排序(6)快速排序(7)堆排序7中排序算法中:快速排序、希尔排序、选择排序、堆排序是稳定的排序算法。7大排序算法程序如下:class Solution {public: vector<int> sortArray(vector<int>& nums) { if(nums.size()<=1){

2020-07-07 14:24:51 182

原创 C++与C的区别及对C的增强

语法层次、高级特性、使用场景、效率(1)运行机制上:C是面向过程编程语言,C++是面向对象编程语言。(2)适用方向: C语言适合程序体积小、运行效率高的场合,如嵌入式等更接近底层的环境;C++适合更上层、更复杂的场合,以及一些具体业务的场景。(3)编程语法上: C++具有封装、继承、多态三种特性; C语言不支持重载,C++支持重载; C++相比C语言增加了许多类型安全的功能,如强制类型转换; C++支持范...

2020-07-05 21:52:23 734

原创 C++ 内存管理

以32位的CPU为例,其可以寻址空间大小为4Gb,如下图所示: 每个进程都独立拥有4G的逻辑空间,其中0-3G为用户态空间,3-4G为内核态空间,不同进程都拥有自己的逻辑地址,这些逻辑地址映射到不同的物理地址中。用户态空间虚拟内存分为:代码段txt、数据段data、BSS段、堆区、文件映射区、栈区;(1)代码段:包括只读存储区和文本区,只读存储区存储字符串常量,文本区存储程序的机器码;(2)数据段:存储程序中...

2020-07-05 21:50:56 123

原创 C++ 对齐原则

(1)概念:现代计算机系统中,内存都是依照字节进行划分,理论上讲对于任何类型的变量的访问都可以从任何地址开始,但实际应用中,对特定类型的变量经常在特定内存地址进行访问,需要各种类型的数据按照一定的规则进行布置,而不是顺序的一个接一个排列,字节对齐就是用空间换时间,提高存取效率。(2)原则:基本数据类型的自身对齐值:例如,char型数据的自身对齐值为1字节,short类型自身对齐值为2字节,int、float、long类型自身对齐值均为4字节,double类型自身对齐值均为8字节。结...

2020-07-05 21:49:25 1345

原创 刷题 - 岛屿数量

问题描述:给你一个由'1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。对于网格类遍历问题,深度优先搜索dfs是一种典型的解决方案,类比于二叉树的DFS,其程序框架如下:void dfs(TreeNode* node){ if(node == NULL) return; dfs(node->left); .

2020-07-05 12:09:24 152

原创 C++ 智能指针

(1)什么是智能指针:智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露(利用自动调用类的析构函数来释放内存)。原理:智能指针类将一个计数器与类指向的对象相关联,通过计数来记录该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)。

2020-07-03 21:36:32 138

原创 C++ static关键字

(1)全局静态变量: 全局变量前加static,变为全局静态变量;存储在静态存储区,在整个程序运行期间都存在;未初始化的全局静态变量会被初始化为0;全局静态变量在声明他的文件之外不可见。(2)局部静态变量:局部变量前加static,变为局部静态变量;存储在静态存储区;未初始化的局部静态变量会被初始化为0;作用域仍未局部,离开作用域后,局部静态变量仍在内存中,但不可访问,知道再次访问到作用域。(3)静态函数: 在函数返回类型前加static,变为静态函数,函数的定义...

2020-07-03 21:29:19 1424

原创 数据结构 - 二叉树的4种遍历方法

引言二叉树有4种典型的遍历方法:前序、中序、后续、层序。每种遍历的方法在此不在赘述,主要给出四种方法的C++代码。首先设二叉树结点的数据结构如下:struct TreeNode{ int value; //结点值 TreeNode* left; //左孩子 TreeNode* right; //右孩子 TreeNode(int _value,TreeNode* _left,TreeNode* _right): val

2020-07-02 17:22:14 487

原创 TCP/UDP经典问题总结

1、TCP/UDP基本概念:我们知道网络层(IP),可以实现两个主机之间的通信。但是这并不具体,因为,真正进行通信的实体是在主机中的进程,是一个主机中的一个进程与另外一个主机中的一个进程在交换数据。IP协议虽然能把数据报文送到目的主机,但是并没有交付给主机的具体应用进程。而端到端的通信才应该是应用进程之间的通信。UDP,在传送数据前不需要先建立连接,远地的主机在收到UDP报文后也不需要给出任何确认。虽然UDP不提供可靠交付,但是正是因为这样,省去和很多的开销,使得它的速度比较快,比如一些对实时性要求

2020-07-01 14:41:41 810

原创 刷题 - 二叉搜索树的第k小节点

题目描述:给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。根据二叉搜索树的性质,采用中序遍历:class Solution {public: //对于二叉搜索树来说中序遍历的结果就是有序序列,第K个元素就是vec[K-1]存储的节点指针; TreeNode* KthNode(TreeNode* pRoot, unsigned int k) { if(pRoot==..

2020-07-01 09:48:30 2009

原创 刷题 - 按之字形打印二叉树

题目描述:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。解题思路:从题目分析可知,题目的意思是:从上到下,单数行从左到右打印,双数行从右到左打印,这就需要我们在求解过程中要记住当前打印的是单数行还是奇数行。考虑设置两个辅助栈空间,分别用于存放单数行的数据和双数行的数据,根据层序遍历的思想:遍历某一行时,可以直接将下一行的内容缓存,由此得到处理流程思路: ...

2020-07-01 09:10:54 125

原创 C++标准库 - STL容器概述

容器分类:容器总体上可分为3种:序列式容器、关联式容器、无序容器。1、序列式容器 sequence containers:Array,C++11,就是对数组的包装,大小固定; Vector,内存不够可以在后边自动增长; Deque,双向队列,两端可进可出,双向都可动态扩容,queue和...

2020-06-30 16:25:47 171

原创 C++标准库 - STL6大部件概述

C++标准库:C++标准库以header files形式呈现:(1)C++标准库的header files不带.h,如:#include <vector>(2)新式的C header files不带后缀.h,如:#include <cstdio>(3)旧式的C header files带后缀.h,如:#include <stdio.h>新式的headers内的组件封装在 namespace std 当中:using namsespace std;旧式的

2020-06-30 16:00:53 1634

原创 设计模式 - 单例模式

确保一个类只有一个实例,并对这个实例提供一个全局的访问节点。 方法:将类的构造函数声明为private(外部无法new),声明一个private static的类指针保存该类唯一的实例,最后提供一个public的成员函数,提供访问该实例的接口。(1)最简单的实现(线程危险)//懒汉式:单例类class SINGLETON {private: SINGLETON(){} //构造函数私有化 static SINGLETON* p; //指...

2020-06-29 20:23:29 79

原创 设计模式 - 基础

设计模式:设计模式学习笔记,记录设计模式的基础知识、编码、常见问题等,将随着本人学习,不断更新。内容如有错误,非常欢迎大家的指证。1、设计模式的分类:创建型模式:通常和对象的创建有关,涉及到对象实例化的方式。(共5种模式)结构型模式:描述的是如何组合类和对象以获得更大的结构。(共7种模式)行为型模式:用来对类或对象怎样交互和怎样分配职责进行描述。(共11种模式)(1)创建型模式用来处理对象的创建过程,主要包含以下5种设计模式:1,工厂方法模式(FactoryMethod...

2020-06-29 20:21:03 114

原创 刷题 - 约瑟夫问题 -模拟过程及简单求解

约瑟夫问题约瑟夫问题表述如下:假定有N个人围成一个环,并对每个人进行顺序编号,我们设定一个数字M,M<=N,从第一个人开始报数,报到M后这个人出列,剩下的人继续从1开始报数,报到M出列,依次进行下去,直到所有的人都出列。模拟约瑟夫全过程:模拟约瑟夫问题的全过程,记录出列的人的顺序,模拟约瑟夫问题的方法可以用链表也可以用数组,在此我们用数组的方式给出模拟约瑟夫问题的过程:假定共有N个人,我们申请一个大小为N的数组,这个数组每个位置依次对应着编号为1、2、3、....、N的人,则数组编

2020-06-29 10:51:32 573

原创 刷题 - 和为S的两个数 - 双指针

题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。解题思路:笔者在前面刷题系列中写了一个 “和为S的连续正数序列 ”,这个问题中采用了双指针的方法,本题中同样可以采用这种方法。对给定的递增序列,给定两个双指针分别指向数列头和尾,将指针指向的两个数据求和,与S比较:(1)s1+s2 = S,找到了一组满足条件的数据,返回结果即可;(2)s1+s2 > S,需要缩小,则s2后移一位继续判断;.

2020-06-28 15:09:37 318

原创 刷题 - 和为S的连续正数序列 - 双指针/滑动窗

题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?分析该题目,就是给定一个正数S,求所有和为S的连续的正数序列,本题目我们通过滑动窗来解决,滑动窗也可以理解为一种双指针,两个指针组成了窗口。本题中,待分析的序列就是

2020-06-28 14:45:40 119

原创 刷题 - 数组中只出现1次的两个数

题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。预备知识:对于一个整数数组,首先我们先分析一个简单的情况:假定数组中只有一个数据出现1次,其他数据都出现了两次,如何找到这个只出现1次的数据?位运算中,两个数的异或运算规则是:二进制位相同返回0,不同返回1,由此两个相同数据的异或值为0,任何数据与0的异或还为原值。如1100^1100=0000,1010^0000=1010。所以可以很快想到,上面求唯一一个出现1次的数据就可以对数组中的

2020-06-28 10:43:39 129

原创 刷题 - 判断二叉树是否为平衡二叉树(附加求二叉树的深度/高度)

求解二叉树的深度/高度:采用递归的处理思路进行求解,二叉树中以某个节点为根的子树的高度 = 1+max(左子树高度,右子树高度)。class Solution {public: int TreeDepth(TreeNode* pRoot){ if(!pRoot) return 0 ; return 1+max(TreeDepth(pRoot->left),TreeDepth(pRoot->right)); }};...

2020-06-28 09:54:27 195

原创 刷题-寻找两个链表第一个交点

问题描述:输入两个链表,找出它们的第一个公共结点。本题的思路很简单,首先我们考虑一种特殊的相交链表,如下图所示: 两个相交的链表长度相同,想要找到第一个公共的节点很简单,维护两个指针,从2个链表头开始,逐个节点遍历对比,相同时就找到了第一个公共交点。扩展为复杂的情况,两个链表长度不同时: ...

2020-06-28 09:50:18 205

原创 数据结构 - 红黑树 RB-Tree 与搜索

红黑树存在的意义:红黑树是一种典型的数据结构,任何一种数据结构的存在都有其意义,一定是在某个应用方面存在着极高的利用价值,红黑树是一种高效查找算法数据结构。下面首先简要的给出目前典型的查找方法:(1)暴力搜索:顾名思义,就是对待查找的数据从头到尾遍历,是思路最简单但效率低下的算法,但并不意味着暴力搜索方法就不存在了应用。(2)二分查找:二分查找是一种高效的查找算法,但二分算法查找的应用条件是查找序列应为有序序列,转换成数据结果就是二叉查找树(二叉搜索树、二叉排序树),时间复杂度为O(logn)。

2020-06-27 19:47:28 302

原创 海洋划分简述

根据海洋要素特点及形态特征划分,海洋可以分成主要部分和附属部分。主要的部分为洋,附属的部分是海、海湾、海峡。下面分别根据主要部分和附属部分简述其组成与特点。 首先是洋,世界大洋通常分成四大洋:太平洋、大西洋、印度洋、北冰洋。太平洋是面积最大、深度最深的大洋,同时它是边缘海和岛屿最多的大洋,总面积17868万平方千米,占地球表面积的三分之一,是世界海洋面积的二分之一。大西洋是世界上

2020-06-27 19:20:33 8036

原创 刷题-数组中逆序对数目

问题描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007输入:1,2,3,4,5,6,7,0,输出:7.解题思路:思路1:暴力搜索暴力搜索的方法思路很简单,就是从数组第一个数据开始遍历,逐个比较这个数据与其后数据的大小,记录逆序个数,该方法的时间复杂度为O(n^2)。思路2:分析/归并排序思想1、基于分治思想的归并排序:

2020-06-27 17:04:14 1042

原创 刷题-第一次只出现1次的字符

查找第一次只出现1次的字符:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)解题思路:直观的考虑就是将字符串中每个字符出现的次数统计下来,然后找出第一次出现1次的字符。C++中STL中map是一种关联容器,底层实现结构采用红黑树。map以key-value结构的方式存储数据,关键字key起到了索引作用,value对应索引的数据,map的迭代器不允许修改key的

2020-06-27 16:04:44 126

原创 刷题-丑数提取及丑数判断

题目描述:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

2020-06-27 15:34:23 305

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除