
LeetCode
LeetCode刷题集
爱幻想-hjyp
遇到坎就得迈过去
展开
-
Leetcode 0001 两数之和(哈希数组)
目录题目描述样例思路复杂度代码题目描述给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。样例示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:n原创 2021-11-09 09:40:09 · 124 阅读 · 0 评论 -
Leetcode 525. 连续数组(前缀和)
题目给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。示例 1:输入: nums = [0,1]输出: 2说明: [0, 1] 是具有相同数量0和1的最长连续子数组。示例 2:输入: nums = [0,1,0]输出: 2说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。提示:1 <= nums.length <= 10^5nums[i] 不是 0 就是 1思路先看数据量为原创 2021-06-03 09:55:37 · 220 阅读 · 0 评论 -
Leetcode 1035. 不相交的线(动态规划 最长公共子序列)
题目在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足满足:nums1[i] == nums2[j]且绘制的直线不与任何其他连线(非水平线)相交。请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。以这种方法绘制线条,并返回可以绘制的最大连线数。示例 1:输入:nums1 = [1,4,2], nums2 = [1,2,4]输出:2解释:可以画出两条不交叉原创 2021-05-21 10:16:37 · 279 阅读 · 0 评论 -
Leetcode 1738. 找出第 K 大的异或坐标值(二维数组异或前缀和)
题目给你一个二维矩阵 matrix 和一个整数 k ,矩阵大小为 m x n 由非负整数组成。矩阵中坐标 (a, b) 的 值 可由对所有满足 0 <= i <= a < m 且 0 <= j <= b < n 的元素 matrix[i][j](下标从 0 开始计数)执行异或运算得到。请你找出 matrix 的所有坐标中第 k 大的值(k 的值从 1 开始计数)。示例 1:输入:matrix = [[5,2],[1,6]], k = 1输出:7解释:坐标 (原创 2021-05-20 16:27:03 · 302 阅读 · 0 评论 -
Leetcode 692. 前K个高频单词(哈希表或优先队列)
题目给一非空的单词列表,返回前 k 个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。示例 1:输入: ["i", "love", "leetcode", "i", "love", "coding"], k = 2输出: ["i", "love"]解析: "i" 和 "love" 为出现次数最多的两个单词,均为2次。 注意,按字母顺序 "i" 在 "love" 之前。示例 2:输入: ["the", "day", "is"原创 2021-05-20 15:55:51 · 168 阅读 · 0 评论 -
Leetcode 1442. 形成两个异或相等数组的三元组数目(异或性质)
给你一个整数数组 arr 。现需要从数组中取三个下标 i、j 和 k ,其中 (0 <= i < j <= k < arr.length) 。a 和 b 定义如下:a = arr[i] ^ arr[i + 1] ^ … ^ arr[j - 1]b = arr[j] ^ arr[j + 1] ^ … ^ arr[k]注意:^ 表示 按位异或 操作。请返回能够令 a == b 成立的三元组 (i, j , k) 的数目。示例 1:输入:arr = [2,3,1,6,7]原创 2021-05-18 11:30:24 · 297 阅读 · 0 评论 -
Leetcode 421. 数组中两个数的最大异或值
题目给你一个整数数组 nums ,返回 nums[i] XOR nums[j] 的最大运算结果,其中 0 ≤ i ≤ j < n 。进阶:你可以在 O(n) 的时间解决这个问题吗?示例 1:输入:nums = [3,10,5,25,2,8]输出:28解释:最大运算结果是 5 XOR 25 = 28.示例 2:输入:nums = [0]输出:0示例 3:输入:nums = [2,4]输出:6示例 4:输入:nums = [8,10,2]输出:10示例 5:输入:原创 2021-05-17 16:04:47 · 351 阅读 · 0 评论 -
208. 实现 Trie (前缀树)
题目Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现 Trie 类:Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word 。boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。boolean startsWi原创 2021-05-17 15:04:43 · 96 阅读 · 0 评论 -
LeetCode 993. 二叉树的堂兄弟节点(DFS或BFS)
题目在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。示例 1:输入:root = [1,2,3,4], x = 4, y = 3输出:false示例 2:输入:root = [1,2,3,null,原创 2021-05-17 09:52:39 · 117 阅读 · 0 评论 -
LeetCode 341. 扁平化嵌套列表迭代器(递归)
题目给你一个嵌套的整型列表。请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数。列表中的每一项或者为一个整数,或者是另一个列表。其中列表的元素也可能是整数或是其他列表。示例 1:输入: [[1,1],2,[1,1]]输出: [1,1,2,1,1]解释: 通过重复调用 next 直到 hasNext 返回 false,next 返回的元素的顺序应该是: [1,1,2,1,1]。示例 2:输入: [1,[4,[6]]]输出: [1,4,6]解释: 通过重复调用 next 直到 has原创 2021-05-14 10:59:03 · 166 阅读 · 0 评论 -
LeetCode 191. 位1的个数 (位运算)
题目编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。提示:请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。示例 1:输入:0000000000000原创 2021-05-08 11:48:55 · 113 阅读 · 0 评论 -
LeetCode 73. 矩阵置零 (标记数组)
题目给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。进阶:一个直观的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。你能想出一个仅使用常量空间的解决方案吗?示例 1:输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2:输入:ma原创 2021-05-08 10:44:41 · 145 阅读 · 0 评论 -
LeetCode 938.二叉搜索树的范围和 (递归,BFS)
题目题目链接思路递归:根据二叉搜索树的性质(左子树的值都小于根节点,右子树的值都大于根节点)进行分类,如果当前根节点值为空,直接返回零;如果当前根节点值大于right,需要返回左子树的范围和;如果当前根节点值小于left,需要返回右子树的范围和;如果当前根节点值在[left, right] 之间,则返回左子树的范围和和右子树的范围和以及当前根节点的值BFS:将符合条件的节点放入队列中,但只有范围之内的值才会加入sum代码递归版class Solution { public int ra原创 2021-04-27 09:45:06 · 140 阅读 · 0 评论 -
LeetCode 5650. 执行交换操作后的最小汉明距离
题目链接题目链接思路怎么想:这道题的意思是给你一个数组,其中数组中的某些数字间可以相互交换,交换次数不限,问经过交换后和目标数组对应位置元素不相同的个数;这里有一个非常巧的点,即只要(0,1)可交换,且(1,2)可交换,那么(0,2)就必然可交换;怎么做:我们可以用并查集的方法把可以相互交换的下标放到一个集合(即分支)中,每个分支中的点都是可以相互交换的,这样就会存在多个这样的分支;但是为了根据下标找到其所属的分支,我们还需要一个map,所属分支的根结点作为key,整个分支内的元素作为value;这原创 2021-01-10 17:39:15 · 127 阅读 · 0 评论 -
LeetCode 728. 自除数
题目题目链接思路依次判断区间内每一个数 k 即可,通过不断取余得到每一位上的数字 t ,然后判断数字t是否为零 或者 数字 t 是否可以被 k 整除,一旦满足这两个条件中的一个就应该终止当前数字的判断 代码class Solution {public: vector<int> selfDividingNumbers(int left, int right) { vector<int> res; for(int k = left; k原创 2021-01-10 15:19:16 · 155 阅读 · 0 评论 -
LeetCode 86. 分隔链表
题目题目链接思路拿两个链表,一个记录小于目标值,一个记录大于等于目标值,最后合并两个链表即可;代码class Solution {public: ListNode* partition(ListNode* head, int x) { //分配两个头结点 ListNode *less = new ListNode(0); ListNode *more = new ListNode(0); //辅助指针:p指向元素较小链的末尾原创 2021-01-03 23:38:03 · 86 阅读 · 0 评论 -
LeetCode 287.寻找重复数
题目题目链接思路题目大意:给一个n+1大小的数组,里面的元素都在[1,n]这个范围内,且只有一个数是重复的,重复次数可能大于2,让找到这个数;看到这个题,我就想起了之前做的一道给n个数,其中有一个数占整个数组的一半以上,让找到这个数,做法是保持一个cnt计数器,用来记录当前出现次数最多的数字出现的次数,如果当前这个数不等于当前出现次数最多的数,则cnt–,当cnt为零时,换一个数接着做;当然跟这个题没半毛钱关系,我属实是闲的打这么多字~~~~这题其实是用二分做的,二分的作用就是让你不断地缩小解空间原创 2020-05-26 14:56:51 · 128 阅读 · 0 评论 -
LeetCode 1339.分裂二叉树的最大乘积
题目题目链接思路首先把整个树所有节点值之和算出来;接着计算以每个节点作为根时其子树的节点值 sum 之和;这样当计算出一个节点及其子树节点值之和 res 后,若以这个节点将树分为两个树,那么乘积就是 res * (sum- res);每得到一个答案,就与全局的最优值进行比较;对于取余的问题,可以将res设为long型,最后输出的时候再进行取模操作;【递归常见类型】1、这里递归是带返回值的,可以理解为只要带返回值的递归就是说如果你要求解一个大问题,首先你得求解出一个小问题,用小问题的答案去解原创 2020-05-08 17:57:09 · 318 阅读 · 0 评论 -
LeetCode 228.区间汇总
题目题目链接思路双指针,找到满足题意的连续闭区间 [i,j],找到后会有两种情况,i==j 时 输出一个元素;i!= j 时输出一个区间;其实最后一个元素就两种情况:1.最后一个元素单独是一个区间;2.最后一个元素包含在前一个区间内;代码class Solution {public: vector<string> summaryRanges(vector&l...原创 2020-04-07 10:12:53 · 201 阅读 · 0 评论 -
LeetCode 5377.将二进制表示减到1的步数
题目题目链接思路从后往前遍历字符串,除2相当于右移一位;如果idx所指的是1,则需要不断向前进位,直到碰到0为止,并将这个0位修改为1,在这个过程中,ans++, idx--,表示只需要右移一位即可消除此位;如果idx前面所有位都是1,那么只要ans++,idx--就可以了,直接可以得到结果,不需要改位;如果idx所指元素是0,直接ans++,idx++,代表右移一位即可;代码c...原创 2020-04-06 10:23:14 · 113 阅读 · 0 评论 -
LeetCode 289.生命游戏
题目点击查看原题思路遍历每一个网格点,同时额外写一个辅助函数查看这个网格点周围有几个活细胞;分情况讨论就OK了代码class Solution {public: int dx[8] = {-1, -1, 0, 1, 1, 1, 0, -1}; int dy[8] = {0, 1, 1, 1, 0, -1, -1, -1}; int findCnt(int x...原创 2020-04-02 17:14:33 · 208 阅读 · 0 评论 -
LeetCode 地图分析
题目题目链接思路这道题的大意是对于每一个海洋区域,求出它到陆地的最短距离,然后取求出的这些距离的最大值;可以遍历地图中的每一个元素,如果是海洋,则去找它到最近陆地的距离;如果是陆地,则不用管;如何去找海洋到陆地的最短距离,可以用BFS的思想,借助队列实现;在BFS的过程中,如果需要知道一个元素是在第几次被遍历的,可以用一个变量cnt记录,每次查看当前队列中的元素个数,这些元素一定是上一...原创 2020-03-30 14:36:25 · 386 阅读 · 0 评论 -
LeetCode 按摩师
题目题目链接思路首先这道题是一道动态规划题目,那么我们来找一下状态转移方程;动态规划一般要将问题分成小问题,解出来小问题后再利用小问题的解去解大问题;那么这道题的子问题就是将数据量变小,先解只有一个元素,然后两个,三个.....;对于每个子问题,考虑末尾元素只有取和不取两种可能,如果取末尾元素,那么前一个元素必然不能取;如果不取末尾元素,那么前一个元素可以取,也可以不取;代码c...原创 2020-03-24 10:29:09 · 315 阅读 · 0 评论 -
LeetCode 409. 最长回文串
题目题目链接思路签到题:先把每个字母出现的次数统计一下,然后依次遍历每个字母;如果当前字母的数量为偶数,则总数应加上这个字母出现的次数;如果当前字母的数量为奇数,则总数加上这个字母出现的次数-1;并设置flag为true,代表有奇数次的字母,最后输出时需要加一。知识点A和z间还有其他的非字母字符,不要忘记代码class Solution {public: int ...原创 2020-03-19 15:59:37 · 106 阅读 · 0 评论 -
LeetCode 1372. 二叉树中的最长交错路径
题目题目链接思路这道题由于每个节点的选择与上一节点相关,所以肯定要传入多个参数;从上到下递归解决,如果这个节点是左子树,那么只能看右子树;如果这个节点是右子树,那么只能看左子树;(以后遇到当前节点与上一节点状态有关的递归过程时,肯定要传入多个参数)代码/** * Definition for a binary tree node. * struct TreeNode { * ...原创 2020-03-17 16:59:47 · 122 阅读 · 0 评论 -
LeetCode 1370. 上升下降字符串
题目题目链接思路先把字符串中每个字母出现频率统计出来,然后从前往后,从后往前开始遍历。代码class Solution {public: string sortString(string s) { int arr[26], maxIdx = 0; string ans; memset(arr, 0, sizeof(arr));...原创 2020-03-17 16:49:11 · 210 阅读 · 0 评论 -
LeetCode 54. 螺旋矩阵
题目题目链接思路单纯的模拟一下就可以了,用两个数分别记录一下已经输出过的行数和列数代码class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<int> ans; if(matr...原创 2020-03-17 16:44:08 · 135 阅读 · 0 评论 -
LeetCode 1013. 将数组分成相等的三个部分
题目题目链接思路1.先看整个数组和是不是3的倍数2.在找到和为总和三分之一的位置;以及和为三分之二的位置,复杂度O(n)代码class Solution {public: bool canThreePartsEqualSum(vector<int>& A) { int sum = 0, part1 = 0; for(int...原创 2020-03-17 16:38:40 · 154 阅读 · 0 评论 -
LeetCode 543.二叉树的直径
题目题目链接思路这道题让求二叉树的直径,其实就是找一条通过节点数最多的路径;那么我们还是可以自底向上求解,考虑每个节点,如果当前节点在一条路径上,那么这条路径的最多节点数 = 当前节点左子树的最大深度 + 当前节点右子树的最大深度 + 1;结束条件是叶节点的左右数都是零;代码class Solution {public: int ans; int depth(Tre...原创 2020-03-17 16:31:01 · 94 阅读 · 0 评论 -
LeetCode 1376.通知所有员工所需的时间
题目链接题目链接题目大意意思就是给一颗树,每个节点向他的下一层节点传递消息都需要时间,问根节点传递到叶节点所用的时间;思路:先把这棵树放到一个二维表中,每一行代表一个节点,这一行存放他有哪些孩子节点;递归地自底向上去计算每一层通知到叶节点所用的时间;因为对于一个节点来说,有多种路径走向叶节点,则选取最大值就是最后的结果;代码class Solution {public: /...原创 2020-03-17 16:19:28 · 350 阅读 · 0 评论 -
LeetCode 543.Diameter of Binary Tree
题目题目链接思路题目给一个二叉树,让找出一条经过节点数最多的路径,节点数-1称为这棵树的直径;我们可以发现,对于每一个节点,如果最长路径经过这个节点,那么这条路径经过的节点数目 = 其左子树的深度 + 其右子树的深度 + 1(自身);那么我们就可以定义depth函数来求出以每个节点为根时的深度;全局保存一个变量,用来存放经过的节点数,答案就是节点数-1。代码/** * De...原创 2020-03-10 16:23:29 · 116 阅读 · 0 评论 -
LeetCode 5354.通知所有员工所需的时间
题目题目链接思路这个题首先需要将员工与上级的关系存到一个二维数组中;然后自顶向下递归调用calculate()函数,这个函数的作用是计算一个节点通知到其所有下属的时间;代码class Solution {public: //calculate()函数用来计算某一节点通知其所有下属所用的时间 int calculateTime(vector<vector<i...原创 2020-03-09 12:16:19 · 169 阅读 · 0 评论 -
LeetCode 5353. 灯泡开关 |||
题目题目链接思路给你一个数列,让找到目标数,目标数要求满足比他小的所有数都出现在其左侧,问这样的数有多少个?我们通过一次遍历数组,记录当前值往左数列的最大数,如果最大数等于当前值的下标,则满足题意。代码class Solution {public: int numTimesAllBlue(vector<int>& light) { //ma...原创 2020-03-09 12:05:53 · 210 阅读 · 1 评论 -
Leetcode 994.腐烂的的橘子
题目题目链接思路利用队列进行BFS,我这里用了两种方法,第一种方法借用了一个外部数组,用来存储节点是在第几次侵染时被染成坏橘子的,这样当一个好橘子将被染成坏橘子时,只需要找到侵染源,然后加1就可以了,坏处是占内存,耗时;第二种方法是先得到队列中元素的数量,就是上一次侵染所感染的总数,直接循环这么多次就可以了;代码typedef pair<int,int> pr;cl...原创 2020-03-05 15:10:55 · 160 阅读 · 0 评论