自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 设计模式之抽象工厂模式

意图提供一个创建一系列相关或相关依赖对象的接口,而无需指定它们具体的类。举例说明生产一辆车,需要车身上的各种零件。为了简便说明,假设生产一辆车只需要轮胎和方向盘,并且它们必须要相互匹配才能够使车辆正常运行,所以轮胎和方向盘之间具有依赖关系。就是说车辆A只能使用轮胎A和方向盘A才能正常运行,如果使用轮胎A和方向盘B就无法正常运行。代码#include <iostream>using namespace std;// 轮胎产品 class TyreProduct{};

2020-05-31 18:33:46 149

原创 c++中简单地实现自己的string类

#include <iostream>#include <cstring>using namespace std;class MyString{ // 重载运算符== friend bool operator==(const MyString& str1, const MyString& str2); // 重载运算符!= friend bool operator!=(const MyString& str1, const MyStri

2020-05-30 18:12:28 255

原创 设计模式之装饰器模式

背景:当我们只是给某个对象而不是整个类添加某个具体的功能时。 可以使用装饰器,让装饰器去完成对象所需要添加的某种功能。如果在原有类基础上去继承产生新的类,在新的类中添加这个新功能,这样做会造成代码大量冗余目标:尽量使用组合,不要使用继承;尽量在编译时复用,运行时多态。实例:#include <iostream>using namespace std;class Stream{ public: virtual void Read(int num) = 0; virtual

2020-05-28 17:27:12 133

原创 设计模式之策略模式

背景:当需要完成某一个功能时,在不同的条件下,会有不同的实现方法。如果将这些不同的实现都放在一个类中: 一是造成代码复杂,难以维护。二是如果添加新条件下的不同实现方法,需要重新修改源代码,可能造成意料之外的问题,并且难度会很大。同时也不符合开闭原则:对拓展开放,对修改关闭。三是这个类的不同对象在使用时,可能只会使用到其中一种方法,导致时间复杂度变高,因为需要在所有方法中去找到适合的方法。解决办法:将这些方法剥离出来,使用一个类作为所有方法的基类,不同方法作为子类去继承这个基类,由每个子类分别

2020-05-28 17:17:30 78

原创 C++11新特性:lambda表达式

lambda表达式:它表示一个可以调用的代码单元,可以理解为一个匿名的内联函数。lambda表达式形式:[捕获列表] (参数列表)-> 返回类型 {函数体}仿函数:实质是一个对象,其类中重载了()操作符。在stl中,可以向其已有的算法中传递仿函数,lambda表达式,函数。#include <iostream>#include <vector>#include <algorithm> using namespace std;// 谓词:是一个可以调

2020-05-28 17:01:57 78

原创 C++11新特性:委托构造函数

**委托构造函数:**一个构造函数使用类中其他构造函数完成数据成员的初始化,其本身则称为委托构造函数。例子:#include <iostream>#include <string>using namespace std;class Student{ public: // 非委托构造函数 Student(string name, int age, string sex,int grade):name(name),age(age),sex(sex),grade(gr

2020-05-27 09:47:34 327

原创 C++11新特性:auto与decltype

auto:当想将一个表达式赋给变量时,如果不知道这个表达式的类型时,就可以使用auto去定义这个变量。int val1 = 1, val2 = 2;auto item = val1 + val2; // item类型为intdecltype:当想从表达式的类型推断出要定义的变量的类型,但是不想使用这个表达式的值时,就可以使用decltype去获取表达式的数据类型。const int ci = 0, &cj = ci;decltype(ci) x = 0; // x的类型为const in

2020-05-26 19:54:33 127

原创 两数相加

题目给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序 的方式存储的,并且它们的每个节点只能存储 一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8...

2020-02-01 11:56:39 102

原创 玩筹码

题目数轴上放置了一些筹码,每个筹码的位置存在数组 chips 当中。你可以对 任何筹码 执行下面两种操作之一(不限操作次数,0 次也可以):将第 i 个筹码向左或者右移动 2 个单位,代价为 0。将第 i 个筹码向左或者右移动 1 个单位,代价为 1。最开始的时候,同一位置上也可能放着两个或者更多的筹码。返回将所有筹码移动到同一位置(任意位置)上所需要的最小代价。示例示例 1:输...

2020-01-30 13:35:26 159

原创 按奇偶排序数组 II

题目给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。你可以返回任何满足上述条件的数组作为答案。示例输入:[4,2,5,7]输出:[4,5,2,7]解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。思路设置k1初始化为第一个偶数位置,k2...

2020-01-29 16:54:32 174

原创 按奇偶排序数组

题目给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。你可以返回满足此条件的任何数组作为答案。示例输入:[3,1,2,4]输出:[2,4,3,1]输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。思路1使用双指针法,一个指向首元素,一个指向末尾元素,如果前指针的元素是奇数,则交换,并将后指针前移;否则前指...

2020-01-29 15:25:35 404

原创 较大分组的位置

题目在一个由小写字母构成的字符串 S 中,包含由一些连续的相同字符所构成的分组。例如,在字符串 S = “abbxxxxzyy” 中,就含有 “a”, “bb”, “xxxx”, “z” 和 “yy” 这样的一些分组。我们称所有包含大于或等于三个连续字符的分组为较大分组。找到每一个较大分组的起始和终止位置。最终结果按照字典顺序输出。示例示例 1:输入: "abbxxxxzzy"输出...

2020-01-29 14:57:05 98

原创 找到所有数组中消失的数字

题目给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。示例输入:[4,3,2,7,8,2,3,1]输出:[5,6]思路遍历该数组,如...

2020-01-28 22:28:09 197

原创 数组中重复的数据

题目给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。找到所有出现两次的元素。示例输入:[4,3,2,7,8,2,3,1]输出:[5,6]思路1很容易想到的是统计每个元素出现的次数,然后判断哪些元素出现两次。可以使用一个数组存储每个元素的个数,下标代表出现的元素。时间复杂度o(n) 空间复杂度o(n)vecto...

2020-01-28 22:08:21 456

原创 移动零

题目给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例输入: [0,1,0,3,12]输出: [1,3,12,0,0]思路使用双指针,使一个指针i指向当前遍历到的元素,另一个指针k始终指向一个为0的元素,初始时,i,k均从0开始。void moveZeroes(vector<int>& nums) { ...

2020-01-28 21:42:30 721

原创 寻找旋转排序数组中的最小值 II

题目假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。注意数组中可能存在重复的元素。示例示例 1:输入: [1,3,5]输出: 1示例 2:输入: [2,2,2,0,1]输出: 0思路1直接遍历法,从后向前遍历,不停比较连续的两个数。如果当前元素大于...

2020-01-23 22:20:57 74

原创 寻找旋转排序数组中的最小值

题目假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。注意:你可以假设数组中不存在重复元素。示例示例 1:输入: [3,4,5,1,2]输出: 1示例 2:输入: [4,5,6,7,0,1,2]输出: 0思路1不考虑它是否有序,直接按顺序遍历找到最小...

2020-01-20 15:06:13 103

原创 多数元素

题目给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例示例 1:输入: [3,2,3]输出: 3示例 2:输入: [2,2,1,1,1,2,2]输出: 2思路1最初能想到的肯定是暴力法,我们可以通过两层循环计算出所有数出现的次数,一旦找到某个元素的个数满足条...

2020-01-18 00:26:15 112

原创 从中序与后序遍历序列构造二叉树

题目根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。示例中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树: 3 / \ 9 20 / \ 15 7节点构造struct TreeNode { int val; ...

2020-01-15 22:50:59 145

原创 从前序与中序遍历序列构造二叉树

题目根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。示例前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7节点构造如下struct TreeNode { int val; ...

2020-01-15 22:42:58 163

原创 颜色分类

题目给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。示例输入: [2,0,2,1,1,0]输出: [0,0,1,1,2,2]思路此题可以使用双指针法解决,设置下标i,j,使得i所指的元素之前的位置均为0,j所指的元素之后的位置均为2,使...

2020-01-15 00:54:38 122

原创 删除排序数组中的重复项 II

题目给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例给定 nums = [1,1,1,2,2,3],函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。你不需要考虑数组中超出新长度后面的元素...

2020-01-15 00:31:57 60

原创 不同路径Ⅱ

题目一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?思路由于网格中有障碍物,所以考虑的情况会比没有阻碍的情况相似。同样设置一个二维数组d[m][n]存储到达每个网格的路径数。如果是...

2020-01-14 22:24:21 85

原创 不同路径

题目一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?思路这是一道典型的动态规划题,假设finish位置为[i,j],设到达[i,j]的路径数为d[i][j],则有d[i][j] = d[i][j-1] + d[i-1][[...

2020-01-07 16:39:19 138

原创 在排序数组中查找元素的第一个和最后一个位置

题目给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值,返回 [-1, -1]。示例输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]输入: nums = [5,7,7,8,8,10], target = 6输出: [-1,-1]思路1暴力法:从头开始遍...

2020-01-06 16:10:18 285

原创 四数之和

题目给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。示例给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。满足要求的四元组集合为:[[-1, 0, 0, 1],[-2...

2020-01-05 19:26:49 131

原创 最接近的三数之和

题目给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。示例例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).思路最接近的三数之和类似于三数之...

2020-01-05 18:55:10 57

原创 三数之和

题目给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。示例例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[[-1, 0, 1],[-1, -1, 2]]思路a+b+c=0 可以...

2020-01-05 18:45:23 85

原创 两数相加

题目给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储 一位数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原...

2020-01-04 20:19:27 58

原创 两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。1.暴力破解法o(n^2) 时间复杂度o(n^2) 空间复杂度o(1) vector<int> twoSum(vector<int>& nu...

2020-01-04 19:46:23 73

原创 二叉树的层次遍历

题目:给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。思想:初始时,将根节点存入一个队列中,然后边出队边判断,如果出队的节点左右孩子节点不为空,就将左右孩子节点存入队列中。这个题的要求是将每层的节点分别存储在一个序列中,所以要判断何时恰好遍历完一层,注意到队列初始时存入了根节点,此时队列的长度恰好是第一层节点的个数。所以每次以当前队列的长度(上一层节点的个数)作为...

2020-01-04 19:19:58 99

原创 二叉树的后序遍历

题目:给定一个二叉树,返回它的后序遍历。思想:因为后序遍历,为左右根,情况会比前序和中序复杂。分成两种情况,假设左子树已经被访问:1.左节点已经被访问过,且右节点不存在(右节点已经被访问过),则访问当前节点。2.右节点没有被访问过,则将右节点入栈,把右节点当作是一棵子树的根节点,继续向左遍历判断。 vector<int> postorderTraversal(TreeNode...

2020-01-04 18:58:33 143

原创 二叉树的先序遍历

题目:给定一个二叉树,返回它的前序遍历。思想:二叉树的前序遍历是根左右,这个稍微比中序遍历和后序遍历好理解。 vector<int> preorderTraversal(TreeNode* root) { vector<int> result; stack<TreeNode*> s; //初始化一个栈 T...

2020-01-03 21:55:32 140

原创 二叉树的中序遍历

二叉树的中序遍历题目:给定一个二叉树,返回它的中序遍历。思想:中序遍历是左根右,采用c++实现。vector<int> inorderTraversal(TreeNode* root) { vector<int> result; TreeNode * p = root; stack<TreeNode *> s...

2020-01-03 21:48:12 67

空空如也

空空如也

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

TA关注的人

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