- 博客(186)
- 收藏
- 关注
原创 ★LeetCode-31.下一个排列(重要)
更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1]。而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。交换后,较大数字后的全部升序排列!例如,arr = [1,2,3] 的下一个排列是 [1,3,2]。
2022-09-13 11:15:34
297
原创 141、★并查集-LeetCode-冗余连接Ⅰ和Ⅱ
给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges ,edges[i] = [ai, bi] 表示图中在 ai 和 bi 之间存在一条边。请找出一条可以删去的边,删除后可使得剩余部分是一个有着 n 个节点的树。就是给未连接时的各个节点分配根节点,也叫作代表节点),说明了节点属于哪个集合!遇到属于同一个集合的两个节点时,直接返回就是结果;:也就是找属于哪个节点。
2022-09-13 10:26:52
312
原创 140、LeetCode-841.钥匙和房间-图的概念,简单实现
最初,除 0 号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而,你不能在没有获得钥匙的时候进入锁住的房间。给你一个数组 rooms 其中 rooms[i] 是你进入 i 号房间可以获得的钥匙集合。当你进入一个房间,你可能会在里面找到一套不同的钥匙,每把钥匙上都有对应的房间号,即表示钥匙可以打开的房间。你可以拿上所有钥匙去解锁其他房间。链接:https://leetcode.cn/problems/keys-and-rooms。本题是有向图的形式,就是有单一的方向性,只能由谁到谁;
2022-09-12 14:59:28
388
原创 LeetCode-1365.有多少小于当前数字的数字
换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j!给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。对于 nums[0]=8 存在四个比它小的数字:(1,2,2 和 3)。对于 nums[4]=3 存在三个比它小的数字:(1,2 和 2)。对于 nums[2]=2 存在一个比它小的数字:(1)。对于 nums[3]=2 存在一个比它小的数字:(1)。对于 nums[1]=1 不存在比它小的数字。以数组形式返回答案。
2022-09-11 23:31:14
199
原创 139、★LeetCode-柱状图中最大的矩形
本题:往两侧找第一个小于当前值的值!按照栈底到栈顶递增:出现小于栈顶元素的情况时,就是右侧小于当前值的第一个值出现;栈中一直保持递增(相等的问题不好处理,但是更靠近栈底的数字就包含了所有情况),前一个元素就是左侧第一个!本题中会出现:最后栈中保持递增,有许多位置无法处理的情况!在一维数组中,遇到找两侧最值的问题,经常就是单调栈的问题;1)暴力:for中套while,往两侧找,时间复杂度大。注意坐标的考虑,栈中紧挨着,不代表数组中紧挨着!求在该柱状图中,能够勾勒出来的矩形的最大面积。
2022-09-11 21:17:26
157
原创 138、★很经典的一道题目:LeetCode-42.接雨水
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。本题:单调递减的栈;遇到更大的元素,就要开始处理之前的每一个元素,直到遇到更大的元素(此时要继续处理一次;1)单调栈:单调栈其实将每一个元素都做了入栈操作!输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]如果没有更大的元素,就直接入栈,左边的情况还是处理完了!的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
2022-09-10 23:10:11
156
原创 137、LeetCode-503.下一个更大元素Ⅱ
给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素。数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。本题是将数组变为循环数组:因此单调栈的查找需要 2*N的长度;第二个 1 的下一个最大的数需要循环搜索,结果也是 2。解释: 第一个 1 的下一个更大的数是 2;输入: nums = [1,2,1]输出: [2,-1,2]
2022-09-08 23:00:24
250
原创 135、LeetCode-739.每日温度
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。链接:https://leetcode.cn/problems/daily-temperatures。1)两层for循环的暴力解法,简单的思路;时间复杂度O(N^2)来源:力扣(LeetCode)1)暴力解法:O(N^2)
2022-09-07 00:02:58
146
原创 134、LeetCode-516.最长回文子序列
回文子序列和回文子串不同,子串时不可改变顺序和组成;但是子序列可以将子串中的字符进行删除处理!子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。,只用拿到i + 1和j - 1时的最长子序列加2即可;解释:一个可能的最长回文子序列为 "bbbb"。:dp数组代表i开头,j结尾时的最长回文子序列。1)动态规划:自己写的有点繁琐,但是思路清晰。,即i+1或者j-1时的更大值!输入:s = "bbbab"
2022-09-05 17:30:33
117
原创 133、★LeetCode-647.回文子串
不存在大于等于3个字符的回文中心,因为都可以从1个字符和2个字符的回文中心演变过来!每个字符串,都会有特定个数的回文中心 2n - 1;具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。在使用双层for循环将每一个子串枚举,同时进行回文串的判断,如果符合就加1。dp数组代表以当前i为初始,j为结尾的子串,是否为回文串。3)自己的代码:暴力解法!子字符串 是字符串中的由连续字符组成的一个序列。声明一个判断回文串的方法,时间复杂度为O(N);子串是连续的,不是之前的子序列的情况!
2022-09-05 00:04:55
129
原创 132、LeetCode-72.编辑距离
给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数。链接:https://leetcode.cn/problems/edit-distance。1)动态规划:时间空间复杂度都是 O(MN)来源:力扣(LeetCode)
2022-09-04 22:55:47
241
原创 131、LeetCode-583.两个字符串的删除操作
类似于:寻找两个字符串的最长公共子串;找到之后,将两个字符串中不属于该字串的字符都分别删除即可1)动态规划,二维数组
2022-09-04 19:28:23
241
原创 130、★LeetCode-115.不同的子序列
字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,"ACE" 是 "ABCDE" 的一个子序列,而 "AEC" 不是)2.当前字符相同,就可以将各自减一的个数(当前互相匹配) + 之前减一的s中已经包含的t的数目!给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。3.当前字符不同,只用将之前s减一时包含的此时t的个数挪下来即可!1. dp数组记录,此时分别以当前位置字符结尾时,子序列的数目!
2022-09-04 00:06:22
133
原创 129、LeetCode-392.判断子序列
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。链接:https://leetcode.cn/problems/is-subsequence。这道题只需要最后比较,到达最后位置时,最长子序列的长度是否和较短的字串长度相同!前一道题主要是使用二维dp数组,记录当前位置时,公共子序列的长度;给定字符串 s 和 t ,判断 s 是否为 t 的子序列。类似于之前127的最长公共子序列!
2022-09-02 19:41:08
220
原创 128、LeetCode-53.最大数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。动态更新到此位置时的最大和;并且更新贡献情况,因为前面的数组个数不确定;输入:nums = [-2,1,-3,4,-1,2,1,-5,4]解释:连续子数组 [4,-1,2,1] 的和最大,为 6。子数组 是数组中的一个连续部分。来源:力扣(LeetCode)注意正负贡献的情况;...
2022-08-18 23:40:04
131
原创 127、LeetCode-1143.最长公共子序列;LeetCode-1035不相交的线,两道题代码一样
一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。链接:https://leetcode.cn/problems/longest-common-subsequence。例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。...
2022-08-17 23:31:21
90
原创 126、★LeetCode.718最长重复子数组
链接https//leetcode.cn/problems/maximum-length-of-repeated-subarray。下一层dp[i]用到的是上一层的dp[i-1],如果从前往后填充,会修改成这一层的dp[i-1]对于每个数组每次都出一个前缀子数组;给两个整数数组nums1和nums2,返回两个数组中公共的、长度最长的子数组的长度。输入nums1=[1,2,3,2,1],nums2=[3,2,1,4,7]解释长度最长的公共子数组是[3,2,1]。...
2022-07-25 20:49:29
78
原创 124、★最长递增子序列-LeetCode-300
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。链接https//leetcode.cn/problems/longest-increasing-subsequence。解释最长递增子序列是[2,3,7,101],因此长度为4。1.动态规划将状态表示为以nums[i]结尾的最长子序列!输入nums=[10,9,2,5,3,7,101,18]代码1是以nums[i]结尾;......
2022-07-20 13:19:31
149
原创 123、买卖股票的最佳时机(加入了手续费)-LeetCode-714
链接https//leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。注意这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。输入prices=[1,3,2,8,4,9],fee=2。总利润((8-1)-2)+((9-4)-2)=8。手里有股票一直就有;......
2022-07-19 22:47:11
78
原创 122、★买卖股票的最佳时机(含冷冻期)-LeetCode-309.买卖股票的最佳时机含冷冻期
题目:思路:①将所有的状态列出:要列全②股票问题:1.对交易次数有限制:股票问题Ⅲ、Ⅳ2.对交易次数没有限制:Ⅰ、Ⅱ、冷冻期交易次数限制,出现了新的状态维度:加上了第几次交易的情况③动态规划的情况,感觉不能钻牛角尖,把状态考虑完整,在逻辑上将状态转移表达全;结果就是对的代码:1.将所有的状态列出 + 状态转移2.三种状态............
2022-07-19 14:41:07
141
原创 121、★★股票问题Ⅳ-LeetCode-188.买卖股票的最佳时机Ⅳ
不管使用几维数组,重要的是:①将多少种状态分析情况;②将状态表示完整;③状态的转移关系弄清楚!动态规划的重点1.三维数组解决问题2.二维数组解决问题3.一维数组解决问题
2022-07-12 20:01:09
122
原创 120、★★股票问题Ⅲ-LeetCode.123买卖股票的最佳时机Ⅲ
动态规划:最难的不一定是状态转移方程;可能是初始化条件,遍历方式;但是最重要的肯定是状态转移!!!理解状态的情况不一定是只有两种状态,常见的是两种状态;但是也可以有多种状态,本题就是有五种状态,简化为四种状态,包括了所有的情况!2.动态规划:四种状态1. 自己瞎写!算法代码,都需要有逻辑,不会是琐碎的拼凑;有时候整体上的内容不容易理解,但是一定都是大体的一个规整的方式............
2022-07-11 17:10:36
242
原创 119、股票问题Ⅱ-已经做过-LeetCode-122
题目:给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。返回 你能获得的 最大 利润 。来源:力扣(LeetCode)思路:贪心:计算差值,只要正数动态规划:记录持有和不持有两种状态,最后不持有股票时利润最大!代码:贪心 + 动态规划...
2022-07-11 15:15:10
73
原创 118、买卖股票的最佳时机-LeetCode-121
题目:思路:记录之前每天的最小值;记录之前每天的最大利润;动态更新即可代码:1. 贪心的思路:复杂度一样,但是多了判断条件,耗时更高2.少了多余的判断3.动态规划:分清楚状态
2022-07-10 20:27:50
73
原创 117、★★打家劫舍Ⅲ-LeetCode.337.
题目描述:思路:树形的动态规划,在二叉树上进行动态规划!动态规划重点:状态转移方程;每个位置的状态;对于题目中所要的结果,只是某种状态下的附加属性!①这道题:每个节点都有两种状态:被偷;不被偷!附加的属性,就是此时偷到的所有价值!②递归 + 动态规划重点就是记录 每个节点处的状态③两种计算价值的情况:1.当前节点不被偷:此时其左右子节点可以被偷也可以不被偷2.当前节点被偷:此时左右子节点都不能被偷代码:★使用长度为2的数组记录,每个节点的状态.........
2022-07-10 17:54:28
191
原创 116、打家劫舍Ⅰ、Ⅱ-LeetCode.198、213
题目描述:打家劫舍Ⅰ思路:代码:1. 空间复杂度为O(N)的dp数组 2. 空间复杂度为O(1)的方式:题目描述:打家劫舍Ⅱ思路:相比于打家劫舍Ⅰ,考虑了头和尾不能同时取到的情况!需要理解学习思路:将数组分为两个;一个只包含头;一个只包含尾!这样就不会出现头尾同时出现的情况,不能想的过于繁琐★拷贝数组的方法:对一个已知数组进行复制!代码:1.自己写的很麻烦的情况2. 使用 O(1)的时间复杂度,对代码进行优化3. 使用 拷贝数组的方式进行改进:...
2022-07-10 17:44:23
119
原创 115、完全背包-LeetCode-139.单词拆分
题目:思路:1)一个重要的点:对字典是否包含某段,自己的第一想法是 不好判断,要组新的字符串;但是最方便的解法是:使用substring()方法,使用下标获取字串,然后进行判断!2)对于背包容量在外,物品在内的理解:如果物品在外,按照之前的背包问题!字典中的字串每次循环,只加进来一个;之前的思路是:如果只有该元素之前的元素,判断怎么组成最后的结果,要的是结果数;这次只判断是否可以,就一个结果,是与否!物品在内,每次判断字串时,就将字典中的所有结果拿来进行比较;更容易得到是或者
2022-05-17 22:24:28
122
原创 114、完全背包-for嵌套-内外层的问题
涉及到排列和组合的问题1)背包容量外层for:排列问题更新dp时,每一个容量的更新,所有的物品都可以取到;以列为周期会存在取到 1,2 和2,1的情况,下一个容量i时,会先尝试放入1,再尝试放入2,再尝试放入3;就是新容量的情况下,把每一个物品再重新尝试一遍放入!2)物品在外层for:组合问题针对已经可取的物品,不断更新dp;以行为周期比如2在1之后可以取到,就只会有1,2的情况因为2可以取到,之后在原有的基础上尝试加入2;不会再出现尝试加入1的情况,只有1,2
2022-05-16 14:56:30
115
原创 113、完全背包问题-LeetCode-279.完全平方数
题目:给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。来源:力扣(LeetCode)思路:完全背包问题:难点(会导致时间复杂度过高):就是 完全平方数的判断!解决方法:不单独判断某个数字是否为完全平方数!将寻找完全平方数 i ,变成了寻找其开方的数。因为某个数开方一定落在 原来的 1 - i区间中!之前
2022-05-16 13:32:16
304
原创 112、☆完全背包-LeetCode-322.零钱兑换
class Solution { public int coinChange(int[] coins, int amount) { //上一道是凑出来组合数,这一道不仅要凑出来,还要找到数量最小的! //倒着来,从大的硬笔开始,出现凑出来的情况就返回?此时成了01背包 int[] dp = new int[amount + 1]; //不再是找组合数,数组值是放入的硬币值! for(int i = 0;i < c.
2022-05-08 22:51:13
197
原创 111、完全背包解法-LeetCode-70.爬楼梯
题目:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?思路:这道题的完全背包解法,适合画dp数组,进行分析学习;可以结合清晰了解之前的dp数组问题!代码:1)完全背包 + 排列情况!class Solution { //背包解决,1 和 2可以拿无数次,所以是完全背包! //需要写 dp数组,画出来理解一下! public int climbStairs(int n) {
2022-05-08 22:41:26
575
原创 110、★-完全背包的排列问题-LeetCode-377.组合总和Ⅳ
题目:给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。题目数据保证答案符合 32 位整数范围。来源:力扣(LeetCode)思路:最近的题目都是背包问题,只写了一种方法方法,一维数组!看的代码随想录,需要再看一下LeetCode题解!代码:1)一维数组 + for循环顺序实现 排列的完全背包:常规模板套路class Solution { public int co
2022-05-08 22:30:28
513
原创 109、★★完全背包的组合问题-LeetCode-518.零钱兑换Ⅱ
题目:给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。假设每一种面额的硬币有无限个。题目数据保证结果符合 32 位带符号整数。来源:力扣(LeetCode)思路:1)注意下标表示的是 情况数,这里表示能取coins[i],则出现新的可能注意目标和的 dp[j] += dp[j - nums[i]]和一和零中 dp = Math.max + 1;情况不.
2022-05-07 00:22:32
224
原创 108、★★★两个维度的背包-LeetCode-474.一和零
题目:给你一个二进制字符串数组 strs 和两个整数 m 和 n 。请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。来源:力扣(LeetCode)思路:1)这道题还是 01背包:注意背包 和 物品区分开!物品只有一个,取或者不取两种情况,就是01背包!只是这道题的背包不是简单的只有一个容量,是两个维度的容量!2)这道题唬人的还有一点,就是字符串和数字的情况;字符串
2022-05-05 23:27:05
237
原创 107、★★★背包问题的-★排列组合-LeetCode-494.目标和
题目:思路:代码:1)一维数组!class Solution { public int findTargetSumWays(int[] nums, int target) { //每一个数字都要用到,数组是一维的! int sum = 0; int n = nums.length; for(int i = 0;i < n;i++){ sum += nums[i]; }
2022-05-05 00:17:13
182
原创 106、★★01背包-动态规划-LeetCode-1049.最后一块石头的重量-模仿416分割等和子集-背公式
题目:有一堆石头,用整数数组stones 表示。其中stones[i] 表示第 i 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为x 和y,且x <= y。那么粉碎的可能结果如下:如果x == y,那么两块石头都会被完全粉碎;如果x != y,那么重量为x的石头将会完全粉碎,而重量为y的石头新重量为y-x。最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0。来源:力扣(LeetCo...
2022-05-04 00:26:38
202
原创 105、★★★背包问题-动态规划-LeetCode-416.分割等和子集
题目:给你一个只包含正整数的非空数组nums。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。思路:要花大功夫弄清楚背包填放的原理;还有准确性!整个过程的分析1)先计算和的一半,如果是整数,就可以进行判断,如果不是就直接false;2)和的一半就是背包的容量!01背包问题,最后背包的最大容量中放的刚好是最大容量的值,就是true;不是就返回false;代码:1)二维dp数组:自己写的没有优化class Solution { publi...
2022-05-03 01:12:35
223
1
原创 104、4.29-动态规划思路总结-第二周的几道题最难想
一、简单的动态规划1.斐波那契数列2.爬楼梯:和斐波那契数列一模一样class Solution { //本题几乎和 斐波那契一样 public int climbStairs(int n) { //1.未优化 int[] dp = new int[n]; dp[0] = 1;//在台阶一处,有一种方式 dp[1] = 2;//两种方式到 n=2处 for(int i = 2;i < n;i+
2022-04-29 18:13:42
160
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人