![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
文章平均质量分 51
程序媛堆堆
这个作者很懒,什么都没留下…
展开
-
单调栈及部分题目
单调栈,顾名思义就是栈内元素单调按照递增(递减)顺序排列的栈。单调递增栈:①在一个队列中针对每一个元素从它右边寻找第一个比它小的元素②在一个队列中针对每一个元素从它左边寻找第一个比它小的元素单调递减栈:①在一个队列中针对每一个元素从它右边寻找第一个比它大的元素②在一个队列中针对每一个元素从它左边寻找第一个比它大的元素单调栈何时用:为任意一个元素找左边和右边第一个比自己大/小的位置用单调栈.由于每个元素最多各自进出栈一次,复杂度是O(n).原创 2023-03-15 15:32:10 · 253 阅读 · 0 评论 -
01背包问题
假设你有一个背包,最多能承重M千克,这里有N个物品,其重量分别为w1、w2、……、wN,其价值分别为v1、v2、……、vN,在背包所能承受的重量下,尽可能得使背包里的价值最大。(注意,该物品只能放或者不放,不能只放该物品的0.8这样子,非0即1,故称为01背包问题)原创 2023-03-14 17:07:08 · 315 阅读 · 0 评论 -
树的直径及例题
树上任意两节点之间最长的简单路径即为树的「直径」。可以用两次深度优先搜索或者动态规划求解。原创 2023-03-12 11:45:52 · 198 阅读 · 0 评论 -
前缀和及部分题目
前缀和指数组的前 N项之和,是个比较基础的算法。原创 2023-03-11 14:53:11 · 391 阅读 · 0 评论 -
982. 按位与为零的三元组
给你一个整数数组 nums ,返回其中 按位与三元组 的数目。按位与三元组 是由下标 (i, j, k) 组成的三元组,并满足下述全部条件:nums[i] & nums[j] & nums[k] == 0 ,其中 & 表示按位与运算符。原创 2023-03-04 10:59:57 · 278 阅读 · 0 评论 -
面试题 05.02. 二进制数转字符串
二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。示例1:输入:0.625输出:“0.101”示例2:输入:0.1输出:“ERROR”提示:0.1无法被二进制准确表示提示:32位包括输出中的 “0.” 这两位。题目保证输入用例的小数位数最多只有 6 位。原创 2023-03-02 09:49:52 · 198 阅读 · 0 评论 -
拓扑排序算法及例题
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。原创 2023-02-16 10:45:57 · 359 阅读 · 0 评论 -
[C++]720. 词典中最长的单词
题目描述给出一个字符串数组 words 组成的一本英语词典。返回 words 中最长的一个单词,该单词是由 words 词典中其他单词逐步添加一个字母组成。若其中有多个可行的答案,则返回答案中字典序最小的单词。若无答案,则返回空字符串。示例 1:输入:words = [“w”,“wo”,“wor”,“worl”, “world”]输出:“world”解释: 单词"world"可由"w", “wo”, “wor”, 和 "worl"逐步添加一个字母组成。示例 2:输入:words = [“a”原创 2022-02-28 09:37:48 · 695 阅读 · 0 评论 -
[C++]230. 二叉搜索树中第K小的元素
题目描述给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。示例 1:输入:root = [3,1,4,null,2], k = 1输出:1示例 2:输入:root = [5,3,6,2,4,null,null,1], k = 3输出:3提示:树中的节点数为 n 。1 <= k <= n <= 1040 <= Node.val <= 104进阶:如果二叉搜索树经常被修改(插入/删除原创 2022-02-27 12:10:29 · 120 阅读 · 0 评论 -
[C++]112. 路径总和
题目描述给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。叶子节点 是指没有子节点的节点。示例 1:输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22输出:true解释:等于目标和的根节点到叶节点路径如上图所示。示例 2:输原创 2022-02-27 10:55:16 · 592 阅读 · 0 评论 -
[C++]15. 三数之和
题目描述给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[]提示:0 <= nums.length <= 3000-105原创 2022-02-22 10:43:56 · 489 阅读 · 0 评论 -
[C++]301. 删除无效的括号
题目描述给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。返回所有可能的结果。答案可以按 任意顺序 返回。示例 1:输入:s = “()())()”输出:["(())()","()()()"]示例 2:输入:s = “(a)())()”输出:["(a())()","(a)()()"]示例 3:输入:s = “)(”输出:[""]提示:1 <= s.length <= 25s 由小写英文字母以及括号 ‘(’ 和 ‘)’ 组成s原创 2021-10-27 09:35:42 · 314 阅读 · 0 评论 -
[C++]496. 下一个更大元素 I
题目描述给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。示例 1:输入: nums1 = [4,1,2], nums2 = [1,3,4,2].输出: [-1,3,-1]解释:对于 num1 中的数字 4 ,你无法在第二个数组中找原创 2021-10-26 09:42:37 · 144 阅读 · 0 评论 -
字典树/前缀树
例题1题目描述Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现 Trie 类:Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word 。boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。boolean sta原创 2021-10-19 09:58:47 · 283 阅读 · 0 评论 -
567.[C++] 字符串的排列
题目描述给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。换句话说,s1 的排列之一是 s2 的 子串 。示例 1:输入:s1 = “ab” s2 = “eidbaooo”输出:true解释:s2 包含 s1 的排列之一 (“ba”).示例 2:输入:s1= “ab” s2 = “eidboaoo”输出:false提示:1 <= s1.length, s2.length <= 104s1原创 2021-10-17 17:32:56 · 88 阅读 · 0 评论 -
[C++]剑指 Offer II 007. 数组中和为 0 的三个数
题目描述给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a ,b ,c ,使得 a + b + c = 0 ?请找出所有和为 0 且 不重复 的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[]提示:0 <= nums.length <= 3000-105 <= nums[i] &原创 2021-10-14 17:18:09 · 195 阅读 · 0 评论 -
72. [C++]编辑距离
题目描述给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1 = “horse”, word2 = “ros”输出:3解释:horse -> rorse (将 ‘h’ 替换为 ‘r’)rorse -> rose (删除 ‘r’)rose -> ros (删除 ‘e’)示例 2:输入:word1 = “inten原创 2021-10-14 13:24:43 · 173 阅读 · 0 评论 -
146. [C++]LRU 缓存机制
题目描述运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之原创 2021-10-10 19:01:19 · 106 阅读 · 0 评论 -
1314. [C++]矩阵区域和
题目描述给你一个 m x n 的矩阵 mat 和一个整数 k ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和:i - k <= r <= i + k,j - k <= c <= j + k 且(r, c) 在矩阵内。示例 1:输入:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 1输出:[[12,21,16],[27,45,33],[24,39,28]]示例 2:输原创 2021-10-09 14:10:14 · 134 阅读 · 0 评论 -
352. [C++]将数据流变为多个不相交区间
题目描述给你一个由非负整数 a1, a2, …, an 组成的数据流输入,请你将到目前为止看到的数字总结为不相交的区间列表。实现 SummaryRanges 类:SummaryRanges() 使用一个空数据流初始化对象。void addNum(int val) 向数据流中加入整数 val 。int[][] getIntervals() 以不相交区间 [starti, endi] 的列表形式返回对数据流中整数的总结。示例:输入:[“SummaryRanges”, “addNum”, “get原创 2021-10-09 11:39:17 · 98 阅读 · 0 评论 -
96. [C++]不同的二叉搜索树
题目描述给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。示例 1:输入:n = 3输出:5示例 2:输入:n = 1输出:1提示:1 <= n <= 19解题思路参考官方的解题思路代码class Solution {public: int numTrees(int n) { if(n==1) return 1; else if(n==2)原创 2021-10-08 14:26:44 · 140 阅读 · 0 评论 -
42. [C++]接雨水
题目描述给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例 1:输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。示例 2:输入:height = [4,2,0,3,2,5]输出:9提示:n == height.length1 <= n <= 2原创 2021-10-07 21:07:46 · 237 阅读 · 0 评论 -
309. [C++]最佳买卖股票时机含冷冻期
题目描述给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。示例:输入: [1,2,3,0,2]输出: 3解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]解题思路参考https://blog.csdn.net/weixin_4518原创 2021-10-03 21:44:29 · 113 阅读 · 0 评论 -
714. [C++]买卖股票的最佳时机含手续费
题目描述给定一个整数数组 prices,其中第 i 个元素代表了第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。示例 1:输入:prices = [1, 3, 2, 8, 4, 9], fee = 2输出:8解释:能够达到的最大利润:在此处买入 pri原创 2021-10-03 21:42:15 · 80 阅读 · 0 评论 -
122. [C++]买卖股票的最佳时机 II
题目描述给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例 1:输入: prices = [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。随后,在第 4 天(股票价格原创 2021-10-02 15:30:31 · 189 阅读 · 0 评论 -
223.[C++]矩形面积
题目描述代码class Solution {public: int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) { if(ay2<=by1||by2<=ay1||ax2<=bx1||bx2<=ax1) return ((ax2-ax1)*(ay2-ay1)+(bx2-bx1)*(by2-by1));原创 2021-09-30 20:14:42 · 168 阅读 · 0 评论 -
517.[C++] 超级洗衣机
题目描述假设有 n 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。在每一步操作中,你可以选择任意 m (1 <= m <= n) 台洗衣机,与此同时将每台洗衣机的一件衣服送到相邻的一台洗衣机。给定一个整数数组 machines 代表从左至右每台洗衣机中的衣物数量,请给出能让所有洗衣机中剩下的衣物的数量相等的 最少的操作步数 。如果不能使每台洗衣机中衣物的数量相等,则返回 -1 。示例 1:输入:machines = [1,0,5]输出:3解释:原创 2021-09-29 16:51:29 · 147 阅读 · 0 评论 -
740. [C++]删除并获得点数
题目描述给你一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。示例 1:输入:nums = [3,4,2]输出:6解释:删除 4 获得 4 个点数,因此 3 也被删除。之后,删除 2 获得 2 个点数。总共获得 6 个点数。示例 2:输入:nums = [2原创 2021-09-28 12:11:48 · 122 阅读 · 0 评论 -
213. [C++]打家劫舍 II
题目描述你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。示例 1:输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为原创 2021-09-28 11:03:49 · 180 阅读 · 0 评论 -
437. [C++]路径总和 III
题目描述给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。示例 1:输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8输出:3解释:和等于 8 的路径有 3 条,如图所示。示例 2:输入:root = [5,4,8,11,null,13,4,原创 2021-09-28 09:44:05 · 97 阅读 · 0 评论 -
338. [C++]比特位计数
题目描述给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。示例 1:输入:n = 2输出:[0,1,1]解释:0 --> 01 --> 12 --> 10示例 2:输入:n = 5输出:[0,1,1,2,1,2]解释:0 --> 01 --> 12 --> 103 --> 114 --> 1005 -->原创 2021-09-27 21:49:42 · 162 阅读 · 0 评论 -
639. [C++]解码方法 II
题目描述一条包含字母 A-Z 的消息通过以下的方式进行了编码:‘A’ -> 1‘B’ -> 2…‘Z’ -> 26要 解码 一条已编码的消息,所有的数字都必须分组,然后按原来的编码方案反向映射回字母(可能存在多种方式)。例如,“11106” 可以映射为:“AAJF” 对应分组 (1 1 10 6)“KJF” 对应分组 (11 10 6)注意,像 (1 11 06) 这样的分组是无效的,因为 “06” 不可以映射为 ‘F’ ,因为 “6” 与 “06” 不同。除了 上面描原创 2021-09-27 21:46:59 · 233 阅读 · 0 评论 -
371. [C/C++]两整数之和
题目描述给你两个整数 a 和 b ,不使用 运算符 + 和 - ,计算并返回两整数之和。示例 1:输入:a = 1, b = 2输出:3示例 2:输入:a = 2, b = 3输出:5提示:-1000 <= a, b <= 1000解题思路用位运算来解决加法问题。循环32次位运算:如果第i位是两个1相加,则该位结果为第i-1位的进位,且该位应往第i+1位进位;如果第i位是两个0相加,则该位结果也为第i-1位的进位,且不用往第i+1位进位;如果第i位是一个1和原创 2021-09-26 12:41:27 · 151 阅读 · 0 评论 -
583. [C/C++]两个字符串的删除操作
题目描述给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。示例:输入: “sea”, “eat”输出: 2解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea"提示:给定单词的长度不超过500。给定单词中的字符只含有小写字母。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/delete-operation-for-two-stri原创 2021-09-25 15:41:39 · 175 阅读 · 0 评论 -
1143. [C/C++]最长公共子序列
题目描述给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。示例 1:输入:text1 = “abcde”, text2 =原创 2021-09-25 15:31:18 · 130 阅读 · 0 评论 -
430. [C++]扁平化多级双向链表
题目描述多级双向链表中,除了指向下一个节点和前一个节点指针之外,它还有一个子链表指针,可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。给你位于列表第一级的头节点,请你扁平化列表,使所有结点出现在单级双链表中。示例 1:输入:head = [1,2,3,4,5,6,null,null,null,7,8,9,10,null,null,11,12]输出:[1,2,3,7,8,11,12,9,10,4,5,6]解释:输入的多级列表如下图所原创 2021-09-24 14:49:46 · 429 阅读 · 0 评论 -
950.[C++]按递增顺序显示卡牌
题目描述牌组中的每张卡牌都对应有一个唯一的整数。你可以按你想要的顺序对这套卡片进行排序。最初,这些卡牌在牌组里是正面朝下的(即,未显示状态)。现在,重复执行以下步骤,直到显示所有卡牌为止:从牌组顶部抽一张牌,显示它,然后将其从牌组中移出。如果牌组中仍有牌,则将下一张处于牌组顶部的牌放在牌组的底部。如果仍有未显示的牌,那么返回步骤 1。否则,停止行动。返回能以递增顺序显示卡牌的牌组顺序。答案中的第一张牌被认为处于牌堆顶部。示例:输入:[17,13,11,2,3,5,7]输出:[2,13,原创 2021-09-24 13:56:45 · 211 阅读 · 0 评论 -
915.[C]分割数组
题目描述解题思路假如按i分割,【0···i】为left,【i+1···numsSize-1】为right,maxLeft【i】为按i分割时left中的最大值,minRight【i】为按i分割时right中的最小值。遍历得到所有maxLfet【i】和minRight【i】,找出最小的i使maxLeft【i】<=minRight【i】即可代码...原创 2021-09-23 16:59:18 · 62 阅读 · 0 评论 -
275. [C]H 指数 II
题目描述给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数,citations 已经按照 升序排列 。计算并返回该研究者的 h 指数。h 指数的定义:h 代表“高引用次数”(high citations),一名科研人员的 h 指数是指他(她)的 (n 篇论文中)总共有 h 篇论文分别被引用了至少 h 次。且其余的 n - h 篇论文每篇被引用次数 不超过 h 次。提示:如果 h 有多种可能的值,h 指数 是其中最大的那个。请你设计并实现对数原创 2021-09-23 15:28:48 · 92 阅读 · 0 评论 -
725.[C++]分隔链表
题目描述给你一个头结点为 head 的单链表和一个整数 k ,请你设计一个算法将链表分隔为 k 个连续的部分。每部分的长度应该尽可能的相等:任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。这 k 个部分应该按照在链表中出现的顺序排列,并且排在前面的部分的长度应该大于或等于排在后面的长度。返回一个由上述 k 部分组成的数组。示例 1:输入:head = [1,2,3], k = 5输出:[[1],[2],[3],[],[]]解释:第一个元素 output[0] 为 o原创 2021-09-22 21:12:34 · 258 阅读 · 0 评论