- 博客(84)
- 收藏
- 关注
转载 2020-08-20
原文哲学家就餐哲学家从 0 到 4 按 顺时针 编号。请实现函数 void wantsToEat(philosopher, pickLeftFork, pickRightFork, eat, putLeftFork, putRightFork):philosopher 哲学家的编号。pickLeftFork 和 pickRightFork 表示拿起左边或右边的叉子。eat 表示吃面。putLeftFork 和 putRightFork 表示放下左边或右边的叉子。由于哲学家不是在吃面就是在想着啥
2020-08-20 21:37:36
205
原创 377. 组合总和 Ⅳ
给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数。示例:nums = [1, 2, 3]target = 4所有可能的组合为:(1, 1, 1, 1)(1, 1, 2)(1, 2, 1)(1, 3)(2, 1, 1)(2, 2)(3, 1)请注意,顺序不同的序列被视作不同的组合。因此输出为 7。来源:力扣(LeetCode)链接:传送门著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。超时dfs:class Solution
2020-08-20 11:08:25
192
原创 738. 单调递增的数字
给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/monotone-increasing-digits著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。注意333222这种情况 应该返回299999而不是332999c
2020-08-16 02:20:57
353
原创 2020-08-14
GCC编译过程预处理(.c):编译,优化(.s, .asm):生成汇编语言汇编(.o) :汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。链接(.exe):预编译将.c 文件转化成 .i文件使用的gcc命令是:gcc –E对应于预处理命令cpp编译将.c/.h文件转换成.s文件使用的gcc命令是:gcc –S对应于编译命令 cc –S汇编将.s 文件转化成 .o文件使用的gcc 命令是:gcc –c对应于汇编命令是 as链接将.o文件转化成可执行程
2020-08-14 16:35:43
364
原创 901. 股票价格跨度
编写一个 StockSpanner 类,它收集某些股票的每日报价,并返回该股票当日价格的跨度。今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。例如,如果未来7天股票的价格是 [100, 80, 60, 70, 60, 75, 85],那么股票跨度将是 [1, 1, 1, 2, 1, 4, 6]。提示:调用 StockSpanner.next(int price) 时,将有 1 <= price <= 10^5。每个测试用例最多可以调用
2020-08-12 11:17:49
142
原创 1156. 单字符重复子串的最大长度
leetcode两种情况,交换或者不交换,交换的情况又分两种,交换后只多一个,交换后多了一串,aaabbaaa 这种是交换后只多一个的情况, aaabaaa交换后多一串的情况,abcdf不交换的情况。遍历两次就行,第一次记录每个字符总数,和不交换情况下最长长度第二次考虑交换的情况class Solution {public: int maxRepOpt1(string text) { if(text.size() == 0) return 0; map&l.
2020-08-10 16:04:01
295
原创 659. 分割数组为连续子序列
给你一个按升序排序的整数数组 num(可能包含重复数字),请你将它们分割成一个或多个子序列,其中每个子序列都由连续整数组成且长度至少为 3 。如果可以完成上述分割,则返回 true ;否则,返回 false 。来源:力扣(LeetCode)链接:添加链接描述贪心算法:思路分析: 分析i时,先查找有没有以i-1结尾的子序列,有则接着,没有则需要新建长度最小的序列【i, i+1, i+2】。class Solution {public: bool isPossible(vector<
2020-07-28 02:13:35
210
原创 152. 乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。leetcode动态规划:dp[i]表示以i结尾的连续子数组的最大乘积,最后返回dp[0]到dp[n-1]中最大的值class Solution {public: int maxProduct(vector<int>& nums) { vector<int> maxf(nums), minf(nums);
2020-07-27 02:01:38
115
原创 329. 矩阵中的最长递增路径
给定一个整数矩阵,找出最长递增路径的长度。对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。leetcode记忆化dfs:class Solution {public: int dir[5] = {1, 0, -1, 0, 1}; int row, col; int dfs(vector<vector<int>>& road, vector<vector<int>
2020-07-26 15:22:41
112
原创 783. 二叉搜索树节点最小距离
定一个二叉搜索树的根节点 root,返回树中任意两节点的差的最小值。leetcode中序遍历:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Sol
2020-07-24 01:57:31
161
原创 双栈实现队列
class CQueue {public: stack<int> s1; stack<int> s2; CQueue() { while(!s1.empty()) s1.pop(); while(!s2.empty()) s2.pop(); } void appendTail(int value) { s1.push(value); } int d
2020-07-21 16:22:13
116
原创 不同的二叉搜索树 II
给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。添加链接描述递归:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int
2020-07-21 10:44:40
127
原创 312. 戳气球
有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。现在要求你戳破所有的气球。如果你戳破气球 i ,就可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注意当你戳破了气球 i 后,气球 left 和气球 right 就变成了相邻的气球。求所能获得硬币的最大数量。来源:力扣(LeetCode)添加链接描述反向思考,每次添加一个气球,直到添满得到最大值
2020-07-20 16:24:47
107
原创 97. 交错字符串
给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。示例 1:输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”输出: true示例 2:输入: s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”输出: false来源:力扣(LeetCode)添加链接描述动态规划class Solution {public: bool isInterleave(strin
2020-07-18 02:34:36
112
原创 926. 将字符串翻转到单调递增
如果一个由 ‘0’ 和 ‘1’ 组成的字符串,是以一些 ‘0’(可能没有 ‘0’)后面跟着一些 ‘1’(也可能没有 ‘1’)的形式组成的,那么该字符串是单调递增的。我们给出一个由字符 ‘0’ 和 ‘1’ 组成的字符串 S,我们可以将任何 ‘0’ 翻转为 ‘1’ 或者将 ‘1’ 翻转为 ‘0’。返回使 S 单调递增的最小翻转次数。来源:力扣(LeetCode)链接:添加链接描述著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。前缀和:class Solution {publ
2020-07-16 16:39:23
212
原创 785. 判断二分图
给定一个无向图graph,当这个图为二分图时返回true。如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我们就将这个图称为二分图。graph将会以邻接表方式给出,graph[i]表示图中与节点i相连的所有节点。每个节点都是一个在0到graph.length-1之间的整数。这图中没有自环和平行边: graph[i] 中不存在i,并且graph[i]中没有重复的值。来源:力扣(LeetCode)添加链接描述我的代码:广度优先遍历,
2020-07-16 01:50:24
165
原创 96. 不同的二叉搜索树
给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?示例:来源:力扣(LeetCode)添加链接描述我的代码:class Solution {public: int numTrees(int n) { int dp[n+1]; if(n == 1) return 1; if(n == 2) return 2; dp[0] = 1; dp[1] = 1; dp[2] = 2;
2020-07-15 02:17:58
122
原创 786. 第 K 个最小的素数分数
一个已排序好的表 A,其包含 1 和其他一些素数. 当列表中的每一个 p<q 时,我们可以构造一个分数 p/q 。那么第 k 个最小的分数是多少呢? 以整数数组的形式返回你的答案, 这里 answer[0] = p 且 answer[1] = q.示例:输入: A = [1, 2, 3, 5], K = 3输出: [2, 5]解释:已构造好的分数,排序后如下所示:1/5, 1/3, 2/5, 1/2, 3/5, 2/3.很明显第三个最小的分数是 2/5.输入: A = [1, 7
2020-07-14 17:42:27
228
1
原创 面试题 16.25. LRU缓存
设计和构建一个“最近最少使用”缓存,该缓存会删除最近最少使用的项目。缓存应该从键映射到值(允许你插入和检索特定键对应的值),并在初始化时指定最大容量。当缓存被填满时,它应该删除最近最少使用的项目。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少
2020-07-14 11:23:40
236
原创 120. 三角形最小路径和
题目:添加链接描述给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。例如,给定三角形:[[2],[3,4],[6,5,7],[4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。int minimumTotal(vector<vector<int>> &triangle){
2020-07-14 10:14:08
100
原创 309. 最佳买卖股票时机含冷冻期
给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。示例:输入: [1,2,3,0,2]输出: 3解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]来源:力扣(LeetCode)添加链接描述class Solution {public
2020-07-12 17:28:36
83
原创 174. 地下城游戏
一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数
2020-07-12 14:45:36
101
原创 93. 复原IP地址
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 ‘.’ 分隔。示例:输入: “25525511135”输出: [“255.255.11.135”, “255.255.111.35”]来源:力扣(LeetCode)添加链接描述。class Solution {public: vector<string> res; bool valid(const strin
2020-07-12 12:01:03
321
原创 字符与数字转换C++
字符串转数字//string str = "123"; const char ch[10] = "123.3";int a;//sscanf(&str[0], "%d", a); sscanf(ch, "%lf", a);数字转字符串char ch[10] ;int a = 123;sprintf(ch, "%d", a);a = 123.345;sprintf(ch, "%.3lf", a); //不加.3精度,字符串后面可能会多几个03.字符转数字int.
2020-07-12 11:10:58
125
原创 920. 播放列表的数量
题目:添加链接描述动态规划:dp[i][j] 表示长度为i的列表包括j首不同的歌的歌单数目;class Solution {public: int numMusicPlaylists(int N, int L, int K) { long long mod = 1000000007; vector<vector<long long> > dp(L+1,vector<long long>(N+1,0)); dp
2020-07-09 16:21:03
185
4
原创 面试题 17.13. 恢复空格
哦,不!你不小心把一个长篇文章中的空格、标点都删掉了,并且大写也弄成了小写。像句子"I reset the computer. It still didn’t boot!“已经变成了"iresetthecomputeritstilldidntboot”。在处理标点符号和大小写之前,你得先把它断成词语。当然了,你有一本厚厚的词典dictionary,不过,有些词没在词典里。假设文章用sentence表示,设计一个算法,把文章断开,要求未识别的字符最少,返回未识别的字符数。注意:本题相对原题稍作改动,只需返回
2020-07-09 11:23:01
147
原创 1016. 子串能表示从 1 到 N 数字的二进制串
给定一个二进制字符串 S(一个仅由若干 ‘0’ 和 ‘1’ 构成的字符串)和一个正整数 N,如果对于从 1 到 N 的每个整数 X,其二进制表示都是 S 的子串,就返回 true,否则返回 false。来源:力扣(LeetCode)添加链接描述class Solution {public:string to_str(int N) { string str = ""; int tmp; while(N) {
2020-07-07 12:11:15
258
原创 1003. 检查替换后的词是否有效
给定有效字符串 “abc”。对于任何有效的字符串 V,我们可以将 V 分成两个部分 X 和 Y,使得 X + Y(X 与 Y 连接)等于 V。(X 或 Y 可以为空。)那么,X + “abc” + Y 也同样是有效的。例如,如果 S = “abc”,则有效字符串的示例是:“abc”,“aabcbc”,“abcabc”,“abcabcababcc”。无效字符串的示例是:“abccba”,“ab”,“cababc”,“bac”。如果给定字符串 S 有效,则返回 true;否则,返回 false。示例 1
2020-07-06 17:26:36
116
原创 杂笔四
抽象与封装抽象:对外接口封装:函数与数据绑定C++中, 虚函数可以为private, 并且可以被子类覆盖(因为虚函数表的传递),但子类不能调用父类的private虚函数。虚函数的重载性和它声明的权限无关。一个成员函数被定义为private属性,标志着其只能被当前类的其他成员函数(或友元函数)所访问。而virtual修饰符则强调父类的成员函数可以在子类中被重写,因为重写之时并没有与父类发生任何的调用关系,故而重写是被允许的。编译器不检查虚函数的各类属性。被virtual修饰的成员函数,不论他们是p
2020-07-06 17:23:46
126
原创 63. 不同路径 II
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。说明:m 和 n 的值均不超过 100。示例 1:输入:[ [0,0,0],[0,1,0],[0,0,0] ]输出: 2解释:3x3 网格的正中间有一个障碍物。从左上角到右下角一
2020-07-06 01:17:56
1419
原创 杂笔三
C++继承面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。基类&派生类一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数。一个派生类继承了所有的基类方法,但下列情况除外:基类的构造函数、析构函数和拷贝构造函数。
2020-07-05 16:53:42
95
原创 44. 通配符匹配
给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。‘?’ 可以匹配任何单个字符。‘*’ 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。示例 1:输入:s = “aa”p = “a”输出: false解释: “a” 无法匹配 “aa” 整个字符串。示例 2:输入:s = “aa”p = ""输
2020-07-05 12:06:40
173
原创 杂笔二
C++类学习笔记友元函数类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。在类内加friend声明。因为友元函数没有this指针,则参数要有三种情况:要访问非static成员时,需要对象做参数;要访问static成员或全局变量时,则不需要对象做参数;如
2020-07-04 17:07:36
112
原创 32. 最长有效括号
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。示例 1:输入: "(()"输出: 2解释: 最长有效括号子串为 "()"示例 2:输入: ")()())"输出: 4解释: 最长有效括号子串为 "()()"stack:class Solution {public: int longestValidParentheses(string s) { stack<int> st; int count =
2020-07-04 11:42:23
89
原创 杂笔
C++类学习笔记类的成员函数关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。定义在类中的成员函数缺省都是内联的,如果在类定义时就在类内给出函数定义,那当然最好。如果在类中未给出成员函数定义,而又想内联该函数的话,那在类外要加上 inline,否则就认为不是内联的。:: 叫作用域区分符,指明一个函数属于哪个类或一个数据属于哪个类。:: 可以不跟类名,表示全局数据或全局函数(即非成员函数)。1.调用非虚成员函数:和调用非成员函数一样,
2020-07-03 19:59:25
105
原创 剪绳子
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。列举十以内的数分析一下就能找到规律:class Solution {public: int cutRope(int number) { int count = 1; i
2020-07-03 14:13:30
85
原创 机器人走格子
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?dfs:class Solution {public: int sum(int i, int j){ int count = 0;
2020-07-03 14:11:50
278
原创 矩阵中的路径
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。ABCESFCSADEE,3*4矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。经典dfs:class Solution {public: int dir[
2020-07-03 11:49:21
90
原创 滑动窗口最大值
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,
2020-07-02 20:20:06
121
原创 数据流中位数
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。class Solution {public: vector<int> v; void Insert(int num) { if(v.empty()) {v.pus
2020-07-02 17:50:30
141
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人