刷题训练营
文章平均质量分 62
该专栏作为leetcode刷题训练营,记录我的刷题心得
庄园特聘拆椅狂魔
每天焦虑一遍,如何变成学术大佬呀| ᴥ•́ )✧
展开
-
LeetCode 热题 100 Day06
矩阵相关题型。原创 2024-04-24 16:35:44 · 957 阅读 · 0 评论 -
LeetCode 热题 100 Day05
矩阵相关题型。原创 2024-04-23 00:12:03 · 896 阅读 · 0 评论 -
LeetCode 热题 100 Day04
数组系列问题。原创 2024-04-22 14:13:19 · 742 阅读 · 0 评论 -
LeetCode 热题 100 Day03
常见的题型有:取模、区间合并、最大子序列和、最长非0子序列等。一些解题思路很巧妙,多练多总结。原创 2024-04-16 08:00:00 · 771 阅读 · 0 评论 -
LeetCode 热题 100 Day02
滑动窗口类问题:总能找到一个窗口,从前往后移动来查找结果值。这个窗口的大小可能是固定的,也可能是变化的。但窗口的大小一定是有限的。原创 2024-04-15 20:07:33 · 760 阅读 · 0 评论 -
【牛客】美团2024届秋招笔试第三场编程真题
求最长连续子序列,该子序列满足平均值为k的条件1.双for循环遍历所有子串,但是超时了2.第二种思路, 给所有的元素-平均数k,问题就变成了最长连续子序列,和为0,所以呢?然后相等还是遍历所有子串,和之前没有什么不同了,时间复杂度还是过不去。3.第三种思路,借鉴大佬的思路,原来考的是前缀和+哈希表哈希表里面存的值是索引,需要注意累加和sum需要用long使用pre来记录前n个元素的和,map记录的是截止当前索引i下,元素和为curO(n) for循环的存好: O(2n) map的元素存储损耗。原创 2024-04-07 17:16:14 · 1336 阅读 · 0 评论 -
【牛客】【刷题节】美团2024届秋招笔试第一场编程真题
这道题是简单题,主要是一个逻辑实现和判断的问题。但是简单题一般喜欢加一点小障碍,所以读题的时候就要比较注意一些约束条件。就比如这道题:过了15/20个测试用例,出现error, 当时没明白到底哪里校验有问题,最后发现:原价、折扣、满减都是正实数。所谓正实数:没有0!!!正实数:是实数(real numbers)中的一个重要概念,它们是大于0的所有实数。正实数包括正整数、正分数(即正小数)以及正无理数。还涉及一些边边角角的考核: 小数点保留两位。原创 2024-03-27 15:59:34 · 1219 阅读 · 0 评论 -
【牛客】【刷题节】美团2024届秋招笔试第二场编程真题
题目见的得少,结果看到题目的时候,看了半天没理解题目的意思对于int long的范围要有概念,否则会导致结果出错看懂题目后,大部分其实是简单题,一些难一点的题目是动态规划问题。关键点在于如何和动态规划思路联合起来,说起来还是题目做的少了。原创 2024-02-25 16:40:54 · 2498 阅读 · 2 评论 -
LeetCode 热题 100 Day01
哈希结构,即hash table,哈希表|散列表结构。图摘自《代码随想录》哈希表本质上表示的元素和索引的一种映射关系。若查找某个数组中第n个元素,有两种方法:1.从头遍历,复杂度:O(n)2.使用数组这种hash结构,根据下标(索引)来查找,复杂度:O(1)实现了。指:根据映射关系,构造hash表的方法: 当根据映射方法进行映射,构造hash表时,出现两个元素抢占一个索引的现象,叫做hash碰撞。如:hash函数 index=(value%3)原创 2024-02-19 03:50:14 · 1063 阅读 · 0 评论 -
Leetcode 84. 柱状图中最大的矩形
给定n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1。求在该柱状图中,能够勾勒出来的矩形的最大面积。这道题目和接雨水的题目类似,接雨水的题目求柱子外组成得到部分,而这道题求解的是柱子内组成的部分。对于这道题,我们呢选中一个柱子,高度h,进行扩展,左边第一个比它小的元素下标是i, 右边第一个比它小的元素下标为j, 则矩形的宽度为:w=j-i-1则选中的矩形可得到的最大高度为: S=h*w=h*(j-i-1)原创 2024-02-18 14:22:32 · 295 阅读 · 0 评论 -
Leetcode 42. 接雨水
给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。左边的柱子和右边的柱子形成围栏,可以使中间能够积水求最大的积水面积。h*w1.横向求解这里的单调栈采用的是横向求解。求最右变第一个比他大的值作为右边界,栈顶第一个元素l=pop()作为底座,下下一个栈顶元素peek()作为左边界则最高高度=min(height[i], height[peek()])则积水面积高度=最高高度-底座=min(height[i], height[peek()])-l。原创 2024-02-17 01:55:45 · 290 阅读 · 0 评论 -
Leetcode 503. 下一个更大元素 II
给定一个循环数组nums的下一个元素是nums[0]),返回 nums中每个元素的。数字x的是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出-1。这里还是求某个值的右边第一个比他大的值,特别的是,数组是循环的,如果在数组末尾没有找到比他大的数,则从新从头开始查找。这里涉及一个数组循环的问题:有两种方式。(1) 将nums复制一份拼接在后面 ,实现循环取数据` (2) 不复制nums,使用取模的方式来取数据。原创 2024-02-17 00:41:51 · 366 阅读 · 0 评论 -
Leetcode 496. 下一个更大元素 I
nums1中数字x的是指x在nums2中对应位置的比x大的元素。给你两个的数组nums1和nums2,下标从开始计数,其中nums1是nums2的子集。对于每个,找出满足的下标j,并且在nums2确定nums2[j]的。如果不存在下一个更大元素,那么本次查询的答案是-1。返回一个长度为的数组ans作为答案,满足ans[i]是如上所述的。题意理解,实质上是指nums1中元素,在nums2中的位置上,其右边第一个比他大的值的下标。原创 2024-02-17 00:07:45 · 318 阅读 · 0 评论 -
Leetcode 739. 每日温度
给定一个整数数组,表示每天的温度,返回一个数组answer,其中answer[i]是指对于第i天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用0来代替。根据题目来看,已知一个数组,求每个元素后第一个比他大的是第几个元素。这道题是一个典型的单调栈问题,可用于求解,后第1个比他大或小的元素等。使用单调栈来解决这道题。单调栈的作用: 记录遍历过的元素的下标,因为求解的是其后第几个比他大,涉及下标的计算。求解其后第一个比他大的元素,则栈应是单调增的栈。原创 2024-02-16 23:33:12 · 424 阅读 · 0 评论 -
Leetcode 516.最长回文子序列
题意理解:给你一个字符串s,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。回文理解为元素对称的字串,这里求字符串中最长的对称字串的长度。使用动态规划的思路来进行解题。解题思路:(1)定义dp数组dp[i][j]表示从i到j的字串中最长回文序列的长度(2)递推公式当且仅当s[i]==s[j]否则:dp[i][j]=Max(dp[i+1][j],dp[i][j-1],dp[i+1][j-1])原创 2024-02-16 17:58:56 · 441 阅读 · 0 评论 -
Leetcode 647. 回文子串
给你一个字符串s,请你统计并返回这个字符串中的数目。是正着读和倒过来读一样的字符串。是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。回文子串可以简单看作是元素对称的字符串,求一个字符串的会问字串,以下给出了一个例子:s = "aaa"66个回文子串: "a", "a", "a", "aa", "aa", "aaa"这里采用动态规划的思路来解决问题。(1)定义dp数组。原创 2024-02-16 17:23:37 · 553 阅读 · 0 评论 -
Leetcode 72 编辑距离
题意理解:给你两个单词word1和word2请返回将word1转换成word2所使用的最少操作数。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符将word1转换为word2,可以进行三种操作:增、删、改,最少操作几次其中特别注意:增和删为互逆操作,其效果是一样的:在word1删除一个元素或在word2添加一个元素,都是进行一次操作效果。这里我们使用动态规划来进行解题。解题思路:(1)定义dp数组。原创 2024-02-16 16:59:33 · 405 阅读 · 0 评论 -
Leetcode 583 两个字符串的删除操作
给定两个单词word1和word2,返回使得word1和word2所需的。可以删除任意一个字符串中的一个字符。该题的要求是:当前有两个单词,要是两个单词剩余的部分相同,最少需要删除多少个字母。这里有两个思路来求解这道题:一种是设置合理的dp数组,通过动态规划的思路来求解最小的操作次数。另一种方式是求解两个单词的最长公共子序列,然后两个单词长度和-二倍的最长公共子序列即为最小删除的次数。动态规划:(1)定义dp数组。原创 2024-02-16 16:33:28 · 468 阅读 · 0 评论 -
Leetcode 115 不同的子序列
题意理解:给你两个字符串s和t,统计并返回在s的中t出现的个数,结果需要对 109 + 7 取模。即此题可以理解为:从s中删除元素去构造t,有多少种方法或者也可以理解为:s中按顺序取t,有多少个则一定有s和t的最长公共子序列为t, 那么s中有多少个这样的最长公共子序列呢。这里采用动态规划思路来解题,则首先要明确dp数组的含义。解题思路:(1)定义dp数组dp[i][j]表示s的第i个元素前有多少个t的第j个元素前子串。(2)初始化。原创 2024-02-14 15:14:49 · 401 阅读 · 0 评论 -
Leetcode 392 判断子序列
题意理解:给定字符串和,判断是否为的子序列。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。即判断s和t是否存在一个最长公共子序列,且该最长公共子序列==s这里采用一个动态规划的思路求解最长公共子序列,其长度==s.size解题思路:(1) 定义dp数组定义二维dp数组,dp[i][j]表示s第i个元素前,t第j个元素前最长公共子序列。i,j指示的是元素之间的位置。原创 2024-02-14 14:16:03 · 352 阅读 · 0 评论 -
Leetcode 53 最大子数组和
题意理解:给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。是数组中的一个连续部分。所以每个元素都有两个状态,是前一部分的延续,或从此处重新开始计算。我们采用动态规划思路来解题。解题思路:(1)定义dp数组dp[i]表示0到i的累加的最大和(2)初始化其余位置不重要会被之后的操作覆盖(3)递推公式(4) 答案:max(dp)原创 2024-02-14 00:33:34 · 345 阅读 · 0 评论 -
Leetcode 1035 不相交的线
题意理解:在两条独立的水平线上按给定的顺序写下nums1和nums2中的整数。现在,可以绘制一些连接两个数字nums1[i]和nums2[j]请注意,连线即使在端点也不能相交:每个数字只能属于一条连线。以这种方法绘制线条,并返回可以绘制的最大连线数。从上面的图可以看出,此题其实求的还是最长公共子序列,由他们可以组成最多的且不相交的线。所以该题是套了一个壳子的求最长公共子序列的问题,注意最长公共子序列不要求连续。解题思路:(1)定义二维dp数组。原创 2024-02-14 00:12:32 · 704 阅读 · 0 评论 -
Leetcode 1143 最长公共子序列
题意理解:给定两个字符串text1和text2,返回这两个字符串的最长的长度。如果不存在,返回0。一个字符串的是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。"ace""abcde""aec""abcde"两个字符串的是这两个字符串所共同拥有的子序列。此题求解两个数组的最长公共子序列,其中特别的:该最长子序列不要求连续。原创 2024-02-13 23:59:32 · 589 阅读 · 0 评论 -
Leetcode 718 最长重复子数组
题意理解:给两个整数数组nums1和nums2,返回两个数组中、长度最长的子数组的长度。如:则最长重复子序列为: 321长度为3这里采用动态规划解决这个问题。最长公共子序列,涉及从nums1的i位置和nums2的j位置,长度为x的公共子序列。所以:我们这里定义一个二维数组来统计状态。解题思路:(1)定义二维dp数组dp[i][j]表示从nums1中到第i个位置之前,即nums1[i-1]的位置, 从nums2中到第j个位置以前,即nums2[j-1]的位置,所获得的最长公共子序列。原创 2024-02-13 16:31:52 · 530 阅读 · 0 评论 -
Leetcode 674 最长连续递增序列
题意理解:给定一个未经排序的整数数组,找到最长且,并返回该序列的长度。可以由两个下标l和rl < r)确定,如果对于每个l <= i < r,都有,那么子序列就是连续递增子序列。这里的子序列,要求连续,所以当碰到不递增的情况断开。这里采用动态规划的思路来进行解题。解题思路:(1)dp[i]表示到nums[i]符合递增要求的子序列的最大长度。(2)初始化每个数字开始,都能获得一个长度的递增子序列所以dp数组初始化为1(3)递推公式。原创 2024-02-13 15:09:01 · 783 阅读 · 0 评论 -
Leetcode 300 最长递增子序列
题意理解:给你一个整数数组nums,找到其中最长严格递增子序列的长度。是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组的子序列。这里的子序列:不连续的递增子序列,不要求连续,所以无法通过相邻比较解题我们使用动态规划的思路进行解题,计算到每个位置,所含的最长子序列长度解题思路:(1)定义一维dp数组dp[i]表示nums[i]为结尾,所获得的最长子序列长度(2)初始化每个位置dp[i]=1,最长一个元素(3)递推公式。原创 2024-02-11 23:24:13 · 341 阅读 · 0 评论 -
Leetcode 714 买卖股票的最佳时机含手续费
给定一个整数数组prices,其中prices[i]表示第i天的股票价格;整数fee代表了交易股票的手续费用。你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。返回获得利润的最大值。这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。这里的股票问题在于:交易期间可以无限次买入卖出唯一的区别是这里涉及,卖出时,需要支付手续费。对于这类问题,可以使用动态规划的思路来进行解题。原创 2024-02-11 23:03:09 · 219 阅读 · 0 评论 -
Leetcode 309 买卖股票的最佳时机含冷冻期
给定一个整数数组prices,其中第prices[i]表示第i天的股票价格。设计一个算法计算出最大利润。你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)股票问题的升级问题,在卖出后存在一天的冷冻时间,不能进行交易。股票这一类的问题都可以通过分析各个状态使用动态规划来解决这个问题。四个状态:1.持有股票的状态:包含当天买入2.卖出后未买入的持续状态:冷冻天后,买入前3.卖出天:包含当天卖出4.冷冻天:不允许交易(1)定义二维dp数组dp[i][0]持有股票的状态。原创 2024-02-11 22:41:55 · 357 阅读 · 0 评论 -
Leetcode 188 买卖股票的最佳时机 IV
题意理解:给你一个整数数组prices和一个整数k,其中prices[i]是某支给定的股票在第i天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成k笔交易。也就是说,你最多可以买k次,卖k次。你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。这道题的特别之处是,最多可以买卖k次,k是一个可以变化的值,所以使用j对k的数值进行遍历。解题思路:(1)定义dp二维[][]数组dp[0][0]表示不操作dp[i][j=2(k-1)+1]表示第k次买入。原创 2024-02-11 17:00:07 · 364 阅读 · 0 评论 -
Leetcode 123 买卖股票的最佳时机 III
题意理解:给定一个数组,它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成交易。你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。这道题目的特殊之处在于,至少两次交易:包含: 不交易、 交一次、 交易两次这里为了便于理解对交易期间每个状态进行定义:五种状态无操作:dp[i][0]第一次持有:dp[i][1]第一次不持有:dp[i][2]第二次持有:dp[i][3]第二次不持有:dp[i][4]原创 2024-02-11 16:25:07 · 359 阅读 · 0 评论 -
Leetcode
给你一个整数数组prices,其中prices[i]表示某支股票第i天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候只能持有股票。你也可以先购买,然后在出售。返回你能获得的利润。这道题允许在该期间内多次交易。可以使用贪心和动态规划来解决,这里使用动态规划进行思考。(1)dp[][]定义二维动态数组:dp[i][0]:表示当天持有股票所得的最大收益。包含当天买入。dp[i][1]: 表示当天不持有股票所得的最大收益。包含当天卖出。(2)初始化dp[0][1]=0;原创 2024-02-11 15:55:48 · 313 阅读 · 0 评论 -
Leetcode 121 买卖股票的最佳时机
给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择买入这只股票,并选择在卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回0。注意:这里只有一只股票,只进行一次买卖,求最大利益。所以:对于每一天,都有两个状态:持有股票、不持有股票这里定义一个二维dp数组:dp[0]表示持有股票能获得的最大收益,dp[0]表示不持有股票能获得最大大受益。对于不持有股票的状态:包含当天卖出。原创 2024-02-10 23:54:33 · 458 阅读 · 0 评论 -
Leetcode 337 打家劫舍 III
之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。所以我们在每层设置一个dp数组: dp[0]表示不偷所能获得的最大金额, dp[1]表示偷所能获得的最大金额。小偷又发现了一个新的可行窃的地区。dp[0]=max(max(偷左,不偷左),max(偷右,不偷右))每个节点都有两种状态:偷当前节点,和不偷当前节点。dp[1]=max(根,不偷左,不偷右)偷了根节点,左右孩子节点不能偷。偷了左右孩子,根节点不能偷。所以每层返回一个dp数组。原创 2024-02-09 01:37:07 · 504 阅读 · 0 评论 -
Leetcode 213 打家劫舍 II
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,。给定一个代表每个房屋存放金额的非负整数数组,计算你,今晚能够偷窃到的最高金额。假设从A点开始偷,若小偷偷了A,则根据规则,不能偷E若小偷没有投A,则可以偷EA B C D E的循环将其进行分情况讨论:。所以我们分两种情况考虑,初次之外,该问题还是一个简单的打家劫舍问题。原创 2024-02-08 01:31:08 · 328 阅读 · 0 评论 -
Leetcode 198 打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,。给定一个代表每个房屋存放金额的非负整数数组,计算你,一夜之内能够偷窃到的最高金额。这道题目的含义可理解为: 有一组元素nums=[1,2,3,1]约束条件时不取相邻的元素,求能获得的最大值当前状态总是由之前的选择来决定,所以可以考虑动态规划来解决问题。假设dp[i]表示有i个元素时,所能获取的最大值。则i=0时,有dp[0]=nums[0]=1。原创 2024-02-07 23:50:03 · 572 阅读 · 0 评论 -
Leetcode 139 单词拆分
此时dp[j]表示长度为j的字符串是否能被指定的元素组成。其次强调凑出target的顺序,所以这里求排列数,所以双for循环先背包后物品遍历。已知元素集合是wordDict, 元素可以重复使用,所以是完全背包问题。则说明长度为j的字符串可以由元素集里的元素组成,即dp[j]=true.这里采用动态规划来解决这个问题,将其转换为一个背包问题。wordDict表示可用的元素,其中元素可以被重复使用。字符串s就是target,是要凑出来的目标。且这里强调顺序,所以这里求的是排列数。时间复杂度:O(n^2)原创 2024-02-07 23:26:23 · 580 阅读 · 0 评论 -
Leetcode 279 完全平方数
给你一个整数n,返回和为n的完全平方数的最少数量。是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,149和16都是完全平方数,而3和11不是。从题目中可以理解: 元素是平方数,即1,4,9,...元素可以使用无数次。而整数n表示要使用平方数凑数来的目标。则该问题是一个完全背包问题。又因为,这里求凑出target的最少完全平方数,所以这里不是一个纯背包问题。原创 2024-02-07 16:36:17 · 519 阅读 · 0 评论 -
Leetcode 322 零钱兑换
给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。计算并返回可以凑成总金额所需的。如果没有任何一种硬币组合能组成总金额,返回-1。你可以认为每种硬币的数量是无限的。coins表示不同值得元素,有无限个,目标是使用元素凑出目标值最少需要多少个硬币。这是一个完全背包问题,但不是一个纯背包问题。因为这里问的不是背包里物品的重量或价值,而是最少用多少个硬币。原创 2024-02-07 14:06:47 · 359 阅读 · 0 评论 -
Kamacoder 57 爬楼梯(第八期模拟笔试)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬至多m (1 <= m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。这里把顶楼等价于target把[0,1,2,3,4,...,n]看作元素集合,且每个元素可以使用无限次所以这个问题是一个完全背包问题。target=楼顶n元素=[0,1,2,...m],使用元素来凑target有多少种方式这里有: 1+2+1 和1+1+2 是两种方式,所以这里求得应该是排序数。原创 2024-02-07 02:11:16 · 231 阅读 · 0 评论 -
Leetcode 377 组合总和 Ⅳ
给你一个由整数组成的数组nums,和一个目标整数target。请你从nums中找出并返回总和为target的元素组合的个数。题目数据保证答案符合 32 位整数范围。这道题目和凑零钱是一样的,需要求使用指定元素(纸币),凑出target(指定金额)有多少种方式。此处,元素是可以重复使用的,所以该问题是一个完全背包问题。首先了解此题目是一个完全背包问题,所以遍历背包时正序,可以保证元素无限次使用。其次,确定题目求得是有多少种方式,而不是重量或最大价值,该题目不是一个纯背包问题。原创 2024-02-06 23:05:43 · 631 阅读 · 0 评论