
LeetCode交流
文章平均质量分 63
The Gao
这个作者很懒,什么都没留下…
展开
-
【力扣技巧之动态规划】力扣322:零钱兑换【C++】
原题给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。你可以认为每种硬币的数量是无限的。分析这道题是一道典型的动态规划的题目。对于动态规划的题目,我们一直说有五个过程,首先要找到状态,其次确定base case,再者定义一个适宜采用动态规划的dp数组,然后要找到状态转移方程,最后求得题解。对于这道题来说,题目要求求解可以凑成总金额所需的最少的硬币个数,那么状态就是对于凑成每一个金额所需原创 2021-06-21 23:25:51 · 701 阅读 · 0 评论 -
【力扣技巧之动态规划】力扣354:俄罗斯套娃信封问题【C++】
原题给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。注意:不允许旋转信封。分析这道题在LeetCode平台上的难度为hard。首先,我们看,如何能够让一个信封嵌套到另一个信封中,当A信封的宽和高都大于B信封的宽和高时,那么B原创 2021-06-21 22:53:01 · 666 阅读 · 0 评论 -
【力扣技巧之动态规划】力扣300:最大递增子序列【C++】
原题给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。分析这道题给定一个的是一个整数数组nums,从中寻找最长递增子序列。子序列是由数组派生而来的序列,与子数组不同,子序列不必须是连续的,只要不改变元素在原数组中的相对位置即可。因为子序列不必须是连续的,采用【滑动窗口】就比较困难。因此,采用动态规划的解法。采用动态规划的解法,首原创 2021-06-21 18:53:04 · 550 阅读 · 0 评论 -
【力扣技巧之动态规划】力扣53:最大子数组和【C++】
原题给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。思路可能很多同学看到是子数组的题目,下意识会想到使用【滑动窗口】的解法进行求解,这其实是一种非常好的条件反射。但是针对这道题目,滑动窗口的解法却不能很好地求解。滑动窗口解法框架中最重要的一点就是左指针和右指针的移动,滑动窗口通过左指针的移动缩小窗口,通过右指针的移动扩大窗口,当然左指针和右指针的移动都有相应的根据。如【力扣3:最长无重复子串】中,右指针的移动依据就是while(right<原创 2021-06-21 13:23:30 · 612 阅读 · 0 评论 -
力扣543:二叉树的直径【C++】
题目给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。分析这道题的难度在LeetCode上被归为简单,但我觉得这道题无论是思路上还是代码的写法上,还有具有中等难度的程度的。这道题要求我们计算直径长度,首先我们要将求直径长度转换成一个好求的量,笔者将求直径长度转换为求二叉树的高度。这个其实是不难理解的,因为直径其实就是经过边的个数,每经过一条边,相当于高度增加1。但是题中说明了这条路径可能穿过根结点,因此最长的路径显然是原创 2021-06-03 21:58:30 · 554 阅读 · 1 评论 -
力扣剑指56:数组中数字出现的次数【C++】【位运算之触类旁通】
剑指56-I题目重现一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。分析如果对空间复杂度没有要求的话,开辟一个unordered_map是一个很好的选择。这样的话解决思路就是,遍历两次,第一次遍历目的是填充unordered_map的key值和value值,第二次遍历目的是查找哈希表中value=2的key值。在此题中,对时间复杂度的要求是O(n),因此不能进行嵌套循环。对空间复杂度的要求是O(1)原创 2021-05-31 21:42:55 · 340 阅读 · 0 评论 -
力扣206:反转链表【C++】
题目分析原题:输入一个链表,反转链表后,输出新链表的表头。分析:题意非常好理解,即把一个单链表逆序。本题需要考虑的主要问题是,如何将单链表逆序。需要特别注意的是,链表所分配到的内存是一段不连续的内存空间,因此对于单一元素的取用非常麻烦。思路分析思路一:堆栈法大家对于堆栈的特性是否了解呢?堆栈的特性是“先入后出”,即先装入的元素会放在堆栈下面,后装入的元素反而在堆栈上面,因此我们可以通过一次存&取的过程实现对输入的元素逆序排列。思路一的代码实现如下:class Solution {原创 2021-04-21 14:56:00 · 479 阅读 · 1 评论 -
力扣179:最大数【C++】
题目分析原题:给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。分析:这道题题意不难理解,暴力解法的思路也不难想,但是实现起来其实是比较困难的,而且时间复杂度远远达不到要求。因此要考虑能够减小时间复杂度的逻辑。同时要注意,返回的是字符串。思路分析我们可以先拿两个数{5,34}举例子,这两个数在不拆分的情况下,可以组成的整数个数为两个,534和345,显然534要更大,因此要测试用例为这两个数,原创 2021-04-14 23:00:32 · 1423 阅读 · 3 评论 -
力扣739:每日温度【C++】
题目分析原题:请根据每日气温列表,重新生成一个列表,对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。分析:这道题的题意并不难理解,对于输入列表的每一个元素,从下标大于其下标的元素中寻找第一个大于它的值,并记录下标之差,最后将所有下标之差返回。思路分析思路一:暴力查找通过分析题意,最好想到的方法就是暴力查找。其具体思路是:第一步:创建一个容器v用于装填输出。若输入为空直接返回v。第二步:既然是对于输入列表的每一个元素,那么考虑原创 2021-04-10 19:38:51 · 879 阅读 · 1 评论 -
力扣263:丑数【C++】
题目分析原题:丑数是只包含质因数 2、3 或 5 的正整数。给定一个整数n,请你判断n是否为丑数,如果是返回 true,否则返回 false。今天的LeetCode每日一题,从代码角度来说比较容易,重要的是从数学角度提炼题目的精髓,其实有点像脑筋急转弯的感觉。思路分析首先,丑数的定义中规定了丑数是正整数,而输入的是整数n,不一定正负或是0,因此需先判断整数n的正负,若为0或负,直接返回false。再者,丑数中只包含了2、3或5这三个因数。那么,我们可以把输入整数n中的2、3、5都除掉。若n为丑数,原创 2021-04-10 16:29:56 · 470 阅读 · 1 评论 -
力扣153:寻找旋转数组的最小值【C++】
题目分析给定数组为一个升序数组的旋转形式,即将小于nums.size()个头部data,不变换先后顺序的前提下放入尾部,形成一个新数组,数组装在一个vector容器中,寻找其中最小值。思路分析思路一:通过algorithm库中的sort函数,将[v.begin(),v.end())前闭后开区间的data进行升序排序,然后返回nums[0]的值即为题解。这是本题最简单,也是最好想到的思路。但是这样的思路显然不是此题所表达的思路,而且在传入引用的前提下,这样的做法会影响容器中数据的排序。因此不可取。思路原创 2021-04-08 11:34:04 · 1122 阅读 · 1 评论