
leetcode刷题
强大的RGG
五道口混子研究生,干饭大队队长!
专注于高性能C++编程,略懂机器学习和语音增强算法。知乎同名。
展开
-
02 用单调队列解决滑动窗口问题
用单调队列解决滑动窗口问题原创 2023-07-17 15:32:25 · 373 阅读 · 0 评论 -
LeetCode刷题之406 根据身高重建队列(贪心算法)
然后对人数进行排序处理,可以把每个结点的k当作再people数组中的index,因为现在的people已经是身高由大到小的序列了,如果按k的值进行插入,就可以得到满足要求的序列了。通过对题目的分析首先确定这是一个有两个维度的问题,一个是h(身高),一个是k(在前面比本身高或者相等的人数)。输入:people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]]输出:[[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]]可以看见性能得到了明显的提升。原创 2022-12-27 14:55:07 · 720 阅读 · 0 评论 -
(吊打二维表中的搜索问题) LeetCode刷题之二维表中进行搜索的问题
在一个二维表中进行搜索是一种经典的题目,最常用的方法就是回溯法,是一种非常直观的方法。步骤方法名1构建visited数组,用来记录是否访问过当前结点2构建四个方向对,用来控制前进方向3搞清楚每一步是否满足题目条件(判别条件)下面我将用两个剑指offer中的例子来进行说明。原创 2022-11-02 17:21:58 · 200 阅读 · 0 评论 -
剑指offer之35 复杂链表的复制
利用回溯的方式,让每个节点的拷贝操作相互独立。对于当前节点,我们首先要进行拷贝,然后我们进行「当前节点的后继节点」和「当前节点的随机指针指向的节点」拷贝,拷贝完成后将创建的新节点的指针返回,即可完成当前节点的两指针的赋值。这样再次遍历的时候,当前结点复制结点的random就是指向当前结点random的下一个结点,最后再把原始结点和复制结点分离开就行了。把原来的A->B->C 变换成 A->A1 -> B->B1->C->C1。(不得不说,同样的思路,官方给的代码的优美程度直接碾压我)。原创 2022-10-14 10:56:28 · 81 阅读 · 0 评论 -
6127LeetCode刷题之优质数对的数目(位运算)
链接https//leetcode.cn/problems/number-of-excellent-pairs。,有了这个思路后,题目就变成了求每个数中1的个数之后再进行组合求满足要求的数对个数。著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。这题要掌握规律才能做的比较轻松,来源力扣(LeetCode)...原创 2022-07-24 18:00:44 · 1557 阅读 · 1 评论 -
LeetCode刷题之301周赛(2335,2336,2337)
题目:现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。给你一个下标从 0 开始、长度为 3 的整数数组 amount ,其中 amount[0]、amount[1] 和 amount[2] 分别表示需要装满冷水、温水和热水的杯子数量。返回装满所有杯子所需的 最少 秒数。解题思路:这题可以看作一个典型的贪心算法,将饮料按数量从小到大排序,设数量为 x,y,z。我们的目标是匹配尽量多不同的饮料。如果x+y...原创 2022-07-11 19:12:50 · 298 阅读 · 0 评论 -
KMP算法(C++实现)
学习过kmp算法的大概都知道那种学了忘,忘了又要学,然后学完代码又写不好的反复境地,所以今天下定决心一定要彻底解决KMP算法,以后不会了能让自己快速捡起来。前缀:包含首字母,不包含尾字母的所有子串后缀:包含尾字母,不包含首字母的所有子串思路就是把这个串的前缀和后缀进行对比,找到最长的相等的前后缀,然后把长度记录到next数组中,用于正式的字符串匹配中。思路都好理解,重点是如何用代码求next数组呢?为什么不同的人求得next数组也不一样呢?(整体右移一位,整体减一,或者不变),大致有这三种next数组的求原创 2022-07-02 16:23:35 · 2489 阅读 · 0 评论 -
151LeetCode刷题之颠倒字符串中的单词
题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/给你一个字符串 s ,颠倒字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。来源:力扣(LeetCode)链接:https:原创 2022-06-29 20:25:50 · 123 阅读 · 0 评论 -
6100 & 6101 LeetCode刷题
最大的收获就是我觉得自己真的菜,和大佬们之间的差距不是一般的大。总共四个题,第一道题倒是不难,差不多8分钟左右写完,但是这时候已经通过的人数就已经达到了3000人。然后到了第二题,是一个典型的DP就可以解决的算法,但是我最后还是没做出来,这个可能是我对这类的题目训练太少。第三个题是我看起来很熟悉的一道题,这不过这道题做了些改编,直到最后我也没能做出来。第四道题我就是看都没看。希望能坚持下去,提升自己的算法水平。今年剩余的目标是刷够100到题吧。第一题:判断一个矩阵是否是X矩阵。第二题:统计放置房原创 2022-06-26 15:54:34 · 102 阅读 · 0 评论 -
454LeetCode刷题之四数相加(与四数之和相区别)
给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:0原创 2022-06-18 18:44:50 · 305 阅读 · 0 评论 -
202LeetCode刷题之快乐数
判断一个数是否是快乐数原创 2022-06-12 16:17:01 · 106 阅读 · 0 评论 -
两数相加(LeetCode)C++实现
1,题目:给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例 1:输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.示例 2:输入:l1 = [0], l2 = [0]输出:[0]示例 3:输入:l1 = [9,9,9,9,9,9,9],原创 2021-03-22 21:28:58 · 471 阅读 · 0 评论 -
LeetCode之移除元素
题目描述:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-element著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 解题思路:在数组和链表的.原创 2022-02-26 17:41:14 · 94 阅读 · 0 评论 -
LeetCode刷题之删除有序数组的重复项(C++实现)
题目: 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。解题思路:用两个变量 i, j来控比较,i用来控原创 2021-04-02 15:59:25 · 199 阅读 · 0 评论 -
LeetCode刷题之N字型变换
题目描述:将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:P A H NA P L S I I GY I R之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);示例 1:输入:.原创 2021-08-15 22:22:44 · 1035 阅读 · 0 评论 -
leetcode刷题之移除元素
题目描述:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-element著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。解题的思路:我采用的是用两个.原创 2021-08-14 22:21:28 · 764 阅读 · 0 评论 -
LeetCode刷题之有序的括号
**给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/valid-parentheses著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。**解题思路:这题的标准思路就是用一个栈来实现,按括号的顺序依次入栈,如果栈内没有元素且此时s[i]为右括号,原创 2021-04-02 15:22:56 · 156 阅读 · 0 评论 -
349LeetCode刷题之两个数组的交集
题目描述:给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。解题思路:c++的stl里面提供了三种集合,set(有序不重复),multiset(有序可重复),unordered_set(无序不可重复)。本题不用考虑顺序问题,说明可以就使用unordered_set来进行求解。先把nums数组的元素放入集合1,然后再遍历num2,分别再集合1中找2的元素,如果存在说明是交集中的元素,但是这里也要注意交集中的元素也不能.原创 2022-04-25 09:56:59 · 349 阅读 · 0 评论 -
142.LeetCode刷题之环形链表2
1. 题目描述:给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。来源:力扣(LeetCode)链接:https://leetcode-c原创 2022-03-28 19:58:11 · 101 阅读 · 0 评论 -
LeetCode 刷题之链表相交(无法确定两个数A和B谁大谁小时候的代码简化)
题目描述:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。图示两个链表在节点 c1 开始相交:来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 解题思路:先求出两个链表的长度,然后求出长度的差值,把长链表的指.原创 2022-03-25 11:32:43 · 1085 阅读 · 0 评论 -
6031LeetCode刷题之K邻近下标
题目:给你一个下标从 0 开始的整数数组 nums 和两个整数 key 和 k 。K 近邻下标 是 nums 中的一个下标 i ,并满足至少存在一个下标 j 使得 |i - j| <= k 且 nums[j] == key 。以列表形式返回按 递增顺序 排序的所有 K 近邻下标。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-all-k-distant-indices-in-an-array著作权归领扣网络所有。商业转载请联.原创 2022-03-13 15:27:45 · 1559 阅读 · 0 评论 -
59 LeetCode刷题之螺旋矩阵II 和 螺旋举证IV
题目描述:给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix解题思路:这个题以人的思维来想很简单,但是用程序来实现还是有点难度的。首先进行填充可以分为四个方向,从左到右,从上到下,从右到左,从下到上。为了每一层的统一性,我们不妨设定每个方向填充的时候采用左闭右开的设置,每循环完四个方向,方向就重置然后起始点往里面进一个,再次进行四个方向的循环。要注意的是,如果n为奇数,最后会形成最中间的一个格子需要单独赋值,如果n为偶数,则.原创 2022-03-03 14:41:14 · 427 阅读 · 0 评论 -
209 LeetCode 之 长度最小的子数组
题目:给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 解题思路.原创 2022-03-01 18:18:36 · 600 阅读 · 0 评论 -
LeetCode刷题之字母异位词分组
题目:给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/group-anagrams著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 解题思路:我使用了两种解题的思路,第一种是自己写一个字符串匹配的函数来判断这两个字符串是否是异位词,然后对它进行分组.原创 2022-01-25 20:34:22 · 178 阅读 · 0 评论 -
用位运算来实现二分查找(>>)
1,mid = (left + right) >> 1 就相当于 mid = (left + right) / 2 但是运算的速度会变快很多。2,代码:class Solution {public: int search(vector<int>& nums, int target) { int left = 0; int right = nums.size()-1; int mid = -1; w原创 2022-01-03 10:56:33 · 559 阅读 · 0 评论 -
LeetCode刷题之旋转图像(c++)
题目描述:给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/rotate-image著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 解题思路:这题只要是知道了进行矩阵处理的规律就特别简单了:情况一:顺时针转 90 度:先转.原创 2021-12-04 19:14:31 · 104 阅读 · 0 评论 -
LeetCode刷题之全排列(c++实现对数组的全排列,回溯法)
题目描述:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。解题思路:本题是使用回溯算法来解决排列问题的标准题目(回溯算法适合解决组合和排列的问题),与组合问题不同的是,排列问题要注意顺序问题,因为排列问题,每次都要从头开始搜索,例如元素1在[1,2]中已经使用过了,但是在[2,1]中还要再使用一次1,所以每次递归的时候不需要从startindex,而是直接从0开始,使用一个used数组来保存已经使用了哪些数。解题代码:class Solution.原创 2021-11-23 10:38:48 · 1067 阅读 · 0 评论 -
LeetCode刷题之跳跃游戏II
题目描述:给你一个非负整数数组 nums ,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/jump-game-ii著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 解题思路:这题我最开始使用的是回溯算法,因为这题也可以使用穷举法来进行解决。知.原创 2021-11-21 20:04:08 · 241 阅读 · 0 评论 -
Leetcode刷题之字符串相乘
题目:给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。解题思路:这种题目就是找规律,解题的关键钥匙就是:num1的第i位(高位从0开始) 和 num2 的第j位 相乘的结果在乘积中的位置是([i+j,i+j+1]),这样我们就可以用两个循环,从高位(index大的位置)开始,依次相乘得到temp,应为i,j位置的乘积结果保存的位置是[i+j,i+j+1],所以先用temp加上mul[i+j+1] 位置的值,这样就能实现进.原创 2021-11-20 10:31:29 · 364 阅读 · 0 评论 -
40LeetCode刷题之组合总和2(回溯法)
题目:给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/combination-sum-ii著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 解题思路:看到这种需要不断组合来进行解决的题目,最直接的思路就是使用DFS,通俗.原创 2021-11-17 21:42:01 · 100 阅读 · 0 评论 -
LeetCode刷题之搜索插入位置(c++)
题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。2. 思路:因为这是一个有序的数组,首先想到的就是二分法,并且里面没有重复的元素,这样用二分查找返回的值就是一个固定的数3. 代码:class Solution {public: int searchInsert(vector<int>& nums, int target) { .原创 2021-11-14 00:49:51 · 207 阅读 · 0 评论 -
39LeetCode刷题之组合总和1
题目描述:给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 target 的唯一组合。candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同,则两种组合是唯一的。对于给定的输入,保证和为 target 的唯一组合数少于 150 个。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/combination-sum著作权归领扣网络.原创 2021-10-29 20:44:17 · 133 阅读 · 0 评论 -
LeetCode刷题之外观数列
题目:给定一个正整数 n ,输出外观数列的第 n 项。「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。你可以将其视作是由递归公式定义的数字字符串序列:countAndSay(1) = “1”countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/count-and-say著作权归领扣网络所有。商业转载请联系.原创 2021-10-19 20:36:30 · 157 阅读 · 0 评论 -
在排序数组中查找元素出现的第一个位置和最后一个位置(c++)
题目描述:Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.If target is not found in the array, return [-1, -1].You must write an algorithm with O(log n) runtime complexity.来源:力扣(Leet.原创 2021-10-12 10:45:17 · 652 阅读 · 1 评论 -
整理字符串(c++)将相邻的互为大小写的字符从串中删除
题目描述:给你一个由大小写英文字母组成的字符串 s 。一个整理好的字符串中,两个相邻字符 s[i] 和 s[i+1],其中 0<= i <= s.length-2 ,要满足如下条件:若 s[i] 是小写字符,则 s[i+1] 不可以是相同的大写字符。若 s[i] 是大写字符,则 s[i+1] 不可以是相同的小写字符。请你将字符串整理好,每次你都可以从字符串中选出满足上述条件的 两个相邻 字符并删除,直到字符串整理好为止。请返回整理好的 字符串 。题目保证在给出的约束条件下,测试样.原创 2021-10-09 16:47:00 · 362 阅读 · 0 评论 -
搜索旋转排序数组(c++)
题目:整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。给你 旋转后 的数组 nums 和一.原创 2021-10-07 11:15:20 · 295 阅读 · 0 评论 -
下一个排列(c++)
题目:实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。2. 解题思路:我是按照leetcode官方的解题方法进行解的,自己尝试了几个解法都没ac就放弃了。官方的解题方法我觉得非常巧妙,从后往前找到nums中第一个比它后一个大的数,那么它的后一个数就是要被交换的,然后再从后往前找第一个比nums[i-1] 大的数与之交换,然后对nums[i]到nums.end.原创 2021-10-06 13:58:59 · 561 阅读 · 2 评论 -
两两交换链表中的结点(c++)
题目:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。2. 解题思路:解这个题的过程还算波折,我之前准备就用基本的一趟遍历的方法来写这个题,后来因为要用的指针太多了我自己都搞混了,所以选择了一种比较容易理解的方法。因为是要交换相邻的值,所以我想的是进行一次遍历,按顺序把链表拆分成两个链表,再按照与拆分时候相反的顺序来进行组合,这样来实现相邻的交换。3. 解题代码:/** * Definition for singly.原创 2021-09-26 16:15:23 · 401 阅读 · 0 评论 -
删除链表的倒数第N个结点(C++一次遍历)
题目:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?2. 解题思路:我采用的是双指针的方式,两个指针之间相隔n-1个元素,当后面的那个结点的next域为空的时候,此时p结点指向倒数第n个结点的前一个结点,直接进行删除,要注意的是链表有n个结点而要删除倒数第n个结点的情况(解决方法见代码)。代码:class Solution {public: ListNode* removeNthFromEnd(ListNode* head, .原创 2021-09-20 20:21:57 · 418 阅读 · 0 评论 -
递归方法(判断二叉树是否是对称二叉树)
递归的函数要干什么?函数的作用是判断传入的两个树是否镜像。输入:TreeNode left, TreeNode right输出:是:true,不是:false递归停止的条件是什么?左节点和右节点都为空 -> 倒底了都长得一样 ->true左节点为空的时候右节点不为空,或反之 -> 长得不一样-> false左右节点值不相等 -> 长得不一样 -> false从某层到下一层的关系是什么?要想两棵树镜像,那么一棵树左边的左边要和二棵树右边的右边镜像,一棵树左原创 2021-09-17 20:52:11 · 212 阅读 · 0 评论