c++
文章平均质量分 72
银-TaMa
吾王美如画
展开
-
1743. 从相邻元素对还原数组
题目描述存在一个由 n 个不同元素组成的整数数组 nums ,但你已经记不清具体内容。好在你还记得 nums 中的每一对相邻元素。给你一个二维整数数组 adjacentPairs ,大小为 n - 1 ,其中每个 adjacentPairs[i] = [ui, vi]表示元素 ui 和 vi 在 nums 中相邻。题目数据保证所有由元素 nums[i] 和 nums[i+1] 组成的相邻元素对都存在于 adjacentPairs 中,存在形式可能是[nums[i], nums[i+1]] ,也可原创 2021-07-25 22:54:07 · 208 阅读 · 0 评论 -
【leetcode】334. 递增的三元子序列
给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。数学表达式如下:如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1,使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否则返回 false 。说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1) 。来源:力扣(LeetCod...原创 2019-07-29 21:31:50 · 212 阅读 · 0 评论 -
【c++ 回顾】关于友元函数的一个例子
判断一下下面这段代码能否通过编译?#include <iostream>#include <string>#include <memory>using namespace std;struct B;extern void F(B* b);struct B{ struct A { friend void F(B...原创 2019-07-17 20:04:50 · 177 阅读 · 0 评论 -
【leetcode】49. 字母异位词分组
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”],输出:[[“ate”,“eat”,“tea”],[“nat”,“tan”],[“bat”]]说明:所有输入均为小写字母。不考虑答案输出的顺序。来源:力扣(LeetCode)链接:https...原创 2019-07-29 16:47:11 · 131 阅读 · 0 评论 -
【leetcode】73. 矩阵置零
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。思路想法第二种方法不高效的地方在于我们会重复对同一行或者一列赋零。我们可以推迟对行和列赋零的操作。我们可以用每行和每列的第一个元素作为标记,这个标记用来表示这一行或者这一列是否需要赋零。这意味着对于每个节点不需要访问 M+NM+N 个格子而是只需要对标记点的两个格子赋值。if cel...原创 2019-07-29 16:42:53 · 222 阅读 · 0 评论 -
【c++ 回顾】所有权
直接的讲,C++ 里面的对象所有权的关系,指的是谁负责delete谁的关系。让我们来看几个例子,假设类 A 的一个成员变量是一个指向了类 B 的实例的指针。独占所有权:如果 A 对 B 有独占所有权的话,那么 A delete B。这里面也包含着另一层意思,如果 C 想要持有 B,那么就必须让 A 放弃对 B 的所有权,把它的成员变量设置为nullptr。现在就由 C 来决定在什么时候 dele...原创 2019-07-17 13:54:03 · 1498 阅读 · 0 评论 -
【c++ 面向对象回顾】里氏代换原则
里氏代换原则的内容只有一句话:子类的对象能够替换其基类的对象被使用。举个例子,任何使用Animal的地方,我们都可以放Cat进去,而完全不扰乱程序的逻辑。而且程序里面关于Animal的假设,Cat都不能打破。这到底是什么意思呢?譬如说,凡是动物都会吃东西,这个没问题,猫也会吃。但是凡是动物都会走路,这个就不对了,因为鱼是动物,但是鱼不会走路。面对这个情况我们就有两种可能:第一种是鱼根本就不应该继承...原创 2019-07-17 13:28:10 · 953 阅读 · 0 评论 -
【c++ 回顾】设计一个不可以复制的类
有了NotCopyable之后,怎样才能让Student不支持复制呢?大家还记得编译器生成默认的复制构造函数和赋值操作符重载的规则吗?如果父类不存在这些函数的话,那么子类默认也不会生成。那么最简单的做法就是让Student去继承自NotCopyable。代码#include <cstdlib>#include <string>using namespace std...原创 2019-07-17 13:05:10 · 200 阅读 · 0 评论 -
【c++回顾】简单继承和虚函数的使用
使用继承的时候有一些需要注意的地方,就是如果你真的要用new来创建这些有继承关系的类的实例,那每一个类的析构函数都要声明为virtual,否则会在一些奇怪的地方出现问题。这个细节在这一章后面的课程会提到。如果一个类(Cat)的父类(Animal)的析构函数是virtual的,那么他自己的析构函数就自动virtual。想象一下你获得了一个Animal* pAnimal;,你怎么知道他到底是Cat还...原创 2019-07-17 12:31:04 · 166 阅读 · 0 评论 -
最大子序和 优先队列
题目描述 输入一个长度为 nn 个数找到最大子序和。输出 一个数,数出他们的最大子序和。样例输入6 41 -3 5 1 -2 3样例输出7数据规模与约定 时间限制:1 s 内存限制:256 M 100% 的数据保证 1≤n≤3000001≤n≤300000因为是求子数组的和,所以先进行一个前缀和的处理,然后,使用一个单调队列来维护区间的...原创 2019-07-07 10:49:29 · 144 阅读 · 0 评论 -
leedcode 53. 最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。这个就是维护一个最小的前缀和,然后判断当前的前缀和和最小前缀和的差值是否可更新ans注意问题1 前缀和初始化为0 ,为了保证求所有元素的和的情况。2 ...原创 2019-07-06 23:13:49 · 118 阅读 · 0 评论 -
【leetcode】78. 子集
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。思路dfs 硬怼用位来表示我们知道,对于给定一个集合里,所有元素的集合它们应该满足这样一个公式: 假设所有的组合数之和为sum,则有sum = C(n, 0) + C(n, 1) + …+ C(n, n); 分别对应取集合中的一个元素,两个元素…n个元素。而通过数学公式二项式定义...原创 2019-07-30 10:37:01 · 109 阅读 · 0 评论 -
【c++ 回顾】static的作用
1. 请说一下static的作用参考回答:全局静态变量在全局变量前加上关键字static,全局变量就定义成一个全局静态变量。静态存储区,在整个程序运行期间一直存在。初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化)。作用域:全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾。局部静态变量在局部变量之前加...原创 2019-07-21 12:46:55 · 135 阅读 · 0 评论 -
【c++ 回顾】四种cast转换
说一说c++中四种cast转换C++中四种类型转换是:static_cast, dynamic_cast, const_cast, reinterpret_caststatic_cast:static_cast: 任何具有明确定义的类型转换都可以使用static_cast进行转换,但是他无法去掉const性质 const char *cp; char *q = static_...原创 2019-07-21 12:47:54 · 387 阅读 · 0 评论 -
【leetcode】316. 去除重复字母
题目给定一个仅包含小写字母的字符串,去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。示例 1:输入: “bcabc”输出: “abc”示例 2:输入: “cbacdcbc”输出: “acdb”来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-duplic...原创 2019-07-28 14:01:37 · 4111 阅读 · 0 评论 -
【leetcode】1071. 字符串的最大公因子
对于字符串 S 和 T,只有在 S = T + … + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。返回字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。示例 1:输入:str1 = “ABCABC”, str2 = “ABC”输出:“ABC”来源:力扣(LeetCode)链接:https://leetcode-cn.com/problem...原创 2019-07-27 23:47:38 · 229 阅读 · 0 评论 -
【c++ 回顾】const
const作用修饰变量 ==> 变量不可变 代替C语言中的#define 常量 可以让编译器进行类型检查匹配修饰指针顶层const 指针的值不可变,但指针指向的可以变底层const 指针指向的值不可以变,但指针可以变const 修饰函数形参的时候,编译器会去掉顶层的const,保留底层的const,所以可以通过底层的const来修饰函数进行函数重载,这个时候会...原创 2019-07-27 15:52:30 · 138 阅读 · 0 评论 -
【c++ 回顾】STL-空间配置器
空间配置器通常的内存申请的方式有两种 1. malloc, 2. new 来申请malloc 申请内存的过程是这样的 它内部有一个将多个可用内存块连接为一个的空闲链表。在调用时,它沿链表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到...原创 2019-07-27 10:52:41 · 191 阅读 · 0 评论 -
【c++回顾】STL 六大组件
STL 六大组件容器: 各种数据结构, 如 vector, list, deque, set, map, 用来存放数据算法: 各种常用算法, 如 sort, search, copy, erase等,从实现的角度来看是一种function template迭代器: 容器和算法之间的胶合剂, 是由容器设计者实现的接口,用来遍历自己容器内部的元素,从而使得不同的容器对外表现相似。函数对象: ...原创 2019-07-27 10:51:55 · 198 阅读 · 0 评论 -
【leetcode】55. 跳跃游戏
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。思路一开始我是想要dfs 但是超时,然后想用dp来解决但是问题就是从左向右跳,右边的状态知道,左边不知道怎么办??所以从右边开始,向左边跳,逆推这个过程,然后判断0是否可以到达,然后问题又来了还是慢 -_-方法 4:贪心当我们把代码改成自底向上的模...原创 2019-07-31 16:31:32 · 192 阅读 · 0 评论 -
【leetcode】238. 除自身以外数组的乘积
给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。示例:输入: [1,2,3,4]输出: [24,12,8,6]说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。进阶:你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组...原创 2019-08-03 16:08:41 · 116 阅读 · 0 评论 -
【leetcode】162. 寻找峰值
.峰值元素是指其值大于左右相邻值的元素。给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。你可以假设 nums[-1] = nums[n] = -∞。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-peak-e...原创 2019-07-30 20:39:20 · 146 阅读 · 0 评论 -
【C++ 回顾】智能指针
对象跟对象之间是有所有权关系的,这些关系可以用shared_ptr、weak_ptr和unique_ptr来表达。但是今天先不提智能指针的事情,先来谈谈什么是所有权。直接的讲,C++ 里面的对象所有权的关系,指的是谁负责delete谁的关系。让我们来看几个例子,假设类 A 的一个成员变量是一个指向了类 B 的实例的指针。独占所有权:如果 A 对 B 有独占所有权的话,那么 A delete B...原创 2019-07-21 15:17:29 · 112 阅读 · 0 评论 -
【C++ 回顾】 C++ 中指针和引用的区别?
1.指针有自己的一块空间,而引用只是一个别名;2.使用sizeof看一个指针的大小是4,而引用则是被引用对象的大小;3.指针可以被初始化为NULL,而引用必须被初始化且必须是一个已有对象 的引用;4.作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引 用的修改都会改变引用所指向的对象;5.可以有const指针,但是没有const引用;6.指针在使用中可以指向其它对象,但是引...原创 2019-07-21 13:28:03 · 165 阅读 · 0 评论 -
【c++回顾】内存管理机制
在这个模型中,我们将会把一个 C++ 程序在运行的时候所占据的内存空间,分成以下四个部分:栈区( Stack )堆区( Heap )全局区/静态区( Global/Static )常量区( Constant )在 C++ 程序的内存空间中,我们在代码中声明的局部变量,以及函数的形式参数,都保存在栈区中——这部分内存在程序运行的时候会自动分配,而在不需要的时候也会自动释放,并不需要程序员自己去手...原创 2019-07-18 11:32:52 · 174 阅读 · 0 评论 -
【c++ 回顾】STL 常用算法
把vector里面的数字都乘以2#include <vector>#include <algorithm>#include <vector>using namespace std;int main(){ vector<int> xs{ 1,2,3,4,5 }; transform(begin(xs), end(xs),...原创 2019-07-18 10:40:54 · 413 阅读 · 0 评论 -
【数据结构回顾】快速选择
问题:给定一个数组,对于某个区间,找出其中第 kkk 大的元素。针对这个问题,有一个经典的算法被称为 快速选择算法,它可以在 O(n)\mathcal{O}(n)O(n) 的时间复杂度内找出区间内第 kkk 大元素。还记得快速排序中的一个步骤——划分区间么?经过一个 O(n)\mathcal{O}(n)O(n) 复杂度的区间划分过程,可以将数组分为两部分,第一部分的元素值都小于等于 pivot...原创 2019-07-06 12:46:55 · 204 阅读 · 0 评论 -
c++ 程序的一般组织结构
这里我们举个简单的例子来说明多个文件的组织方法:假设我们现在有一个类Point,那么我们就可以将其拆分成以下三个文件://Point.hclass Point{public: Point(); //其他类成员};//Point.cpp#include "Point.h"Point::Point(){ //类成员函数实现}//main.cpp#include "P...原创 2019-07-02 18:53:48 · 1210 阅读 · 0 评论 -
c++ new 与 malloc 区别
这里需要说明的是,new运算符和malloc函数,并不只是有语法层面的不同——两者的功能是完全不一样的。malloc只是分配一块指定大小的堆内存,而new则不同——它同时包括两个步骤:调用malloc分配一片堆内存建立变量或者对象——如果要建立的是一个对象的话,那么这一步new运算符会调用类的构造函数来完成除此之外,还有一点是 重载的new运算符——“就地构造” placement new。它...原创 2019-07-02 16:29:19 · 176 阅读 · 0 评论 -
【c++回顾】虚函数
虚函数的出现是为了实现多态。多态我感觉 是当一个引用根据它实际指向的对象,执行对应的方法。因为父类类型的指针,或引用可以指向继承了该父类的子类的对象。普通函数的执行是跟着类走的,虚函数的执行是跟着对象走的所以呢,通过虚函数来使用类的多态。父类声明一个虚函数,由子类来实现,当然了,子类可以覆盖或着继续使用父类的虚函数。那么纯虚函数是啥呢?就是父类完全不去实现这个虚函数,意味着子类要继承这...原创 2019-07-07 23:11:26 · 113 阅读 · 0 评论 -
c++ 常量指针 和 指针常量
常量指针是指针指向的内容是常量,可以有一下两种定义方式:const int * n;int const * n;常量指针说的是不能通过这个指针改变变量的值,但是还是可以通过其他的引用来改变变量的值。int a=5;const int* n=&a;a=6;常量指针指向的值不能改变,但是这并不是意味着指针本身不能改变,常量指针可以指向其他的地址。int a=5;i...原创 2019-07-02 11:04:00 · 310 阅读 · 0 评论 -
c++ 简易内存模型
在这个模型中,我们将会把一个 C++ 程序在运行的时候所占据的内存空间,分成以下四个部分:堆区(Heap)栈区(Stack)全局静态变量区(Static)常量区(Constant)在 C++ 程序的内存空间中,我们在代码中声明的局部变量,以及函数的形式参数,都保存在栈区中——这部分内存在程序运行的时候会自动分配,而在不需要的时候也会自动释放,并不需要程序员自己去手动维护。而我们...原创 2019-07-02 10:49:39 · 154 阅读 · 0 评论 -
3 * 3 矩阵行列式 计算
题目如下就是计算一个3 * 3 和 一个 2 * 2 的行列式。思路如下把x和y分开来看各自的变化规律x 始终是 1 => 2 => 3y 是一个循环变化的过程,那就 ( y + 1 )% 3 来表示循环变化的过程。这样这个过程就可以用两层循环来表示啦。代码如下int a_value = 0; for (int i = 0; i < 3; i++) { ...原创 2019-07-01 16:07:15 · 54133 阅读 · 0 评论 -
leetcode 54. 螺旋矩阵
54. 螺旋矩阵给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例 1:输入:[[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ]]输出: [1,2,3,6,9,8,7,4,5]思路是 方向数组 + 边界调整class Solution {public: int dir[4][2] = {...原创 2019-07-01 15:26:39 · 112 阅读 · 0 评论 -
中缀表达式求值-超级简单的递归栈的实现
问题我就不描述了二叉树我也不累述了回顾一下中缀表达式转换二叉树的过程 同时结合 二叉树的是自底向上计算的性质,我们能得到什么呢即 :优先计算的表达式在二叉树的底部,换句话说权值越高,其在二叉树的位置就越低,即 自底向上计算的时候也就越先运算。但是 对于递归栈来说,是自顶向下生成的也就是说,在生成表达式二叉树的时候,我们是先找到这个表达式里的权值最小的那个操作符,然后递归的得到左右子树的值...原创 2018-11-21 13:56:35 · 1274 阅读 · 0 评论 -
(非暴力)CCF 201803-2 碰撞的小球
问题描述 试题编号: 201803-2 试题名称: 碰撞的小球 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处。有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒。 当小球到达线段的端点(左端点或右端点)的时候,...原创 2018-06-18 21:26:03 · 379 阅读 · 0 评论 -
CCF 201803-1 跳一跳
问题描述 试题编号: 201803-1 试题名称: 跳一跳 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 近来,跳一跳这款小游戏风靡全国,受到不少玩家的喜爱。 简化后的跳一跳规则如下:玩家每次从当前方块跳到下一个方块,如果没有跳到下一个方块上则游戏结束。 如果跳到了方块上,但没有跳到方块的中心则获得1分;跳到方块中心时,若上一...原创 2018-06-17 22:30:45 · 185 阅读 · 0 评论 -
【c++ 回顾】protect 权限
类似于private权限, protect的权限对于类的使用着来说是不可见的类似与pubic权限,protect的权限对于基类的派生类和友元是可见的无法通过派生类访问基类对象的protect的成员第三条就保证了无法通过派生类来绕过protect权限例如#include <iostream>class Base {protected: int x;};c...原创 2019-07-13 15:31:32 · 1720 阅读 · 0 评论 -
【c++回顾】拷贝构造函数参数必须为引用
如果其参数不是引用,则调用永远不会成功,为了调用拷贝构造函数,我们必须拷贝它的实参,但为了拷贝它的实参,我们必须调用它的实参的拷贝构造函数,为了调用它的实参的拷贝构造函数,我们必须拷贝它的实参的实参,但为了拷贝它的实参的实参,我们必须调用它的实参的实参的拷贝构造函数。。。。。形成了递归结构,GG。...原创 2019-07-13 15:46:09 · 242 阅读 · 0 评论 -
【c++回顾】 返回值优化
#include <iostream>using namespace std;class A {public: A() { cout << this << " constructor" << endl; } A(const A &obj) { cout << thi...原创 2019-07-13 16:41:51 · 407 阅读 · 0 评论