Leetcode
Sleeping Monster
这个作者很懒,什么都没留下…
展开
-
【Leetcode 90】C++ 4ms 回溯/位运算 难点除重的子集2
题目Leetcode 90 子集2解题思路本题是子集1的变式,但其实套路和全排列问题相似。而难点在于除重!解题思路都有两种:回溯和位运算。解法一:含有标记数组的回溯(4ms,11.2MB)解法二:不含标记,手动跳过的回溯(推荐!4ms,7.6MB)解法三:位运算(推荐!4ms,7.6MB)代码解法一:含有标记数组的回溯(4ms,11.2MB)先将nums数组进行排序,使相同的元素排在一起。讨论的时候,先分析当前元素不在子集,再分析当前元素在子集中。除重方法:引入vector flag原创 2020-09-29 19:54:03 · 128 阅读 · 0 评论 -
【Leetcode 47】C++ 多种除重方法的全排列2
题目Leetcode 47 全排列2解题思路这道题是全排列1的变式。难点在于除重!!其中,给出3种方法:法一:通过swap实现的回溯,只能通过find来除重。(不推荐!时间复杂度爆炸!!)法二:通过判断nums[i-1]是否被使用来进行除重。(推荐!12ms)法三:通过重新构造vector和freq数组来实现除重。(推荐!8ms)代码法一:通过swap实现的回溯,只能通过find来除重。在通过swap来实现全排列的方法中,我没有想到除了find的方法的实现。如果有大佬有好的方法,欢迎多原创 2020-09-29 19:52:21 · 171 阅读 · 0 评论 -
【Leetcode 46】C++ 回溯法/交换法/stl 简洁易懂的全排列
题目leetcode 46 全排列解题思路法一:回溯法二:交换法(更快!!)法三:stl中的next_permutation(来搞笑的hhh)代码法一:回溯路径:记录在current数组中,记录已经做出的选择选择列表:用vector<bool> nums1来实现,取值为true的可以选择结束条件:当current.size()==nums.size()TIPS:这种用vector<bool> nums1来实现选择列表的方法,比调用find函数在current原创 2020-09-29 19:49:42 · 280 阅读 · 1 评论 -
【Leetcode 649】贪心法&老实法 详细分析:参议院淘汰游戏
题目Leetcode 649 Dota2 参议院淘汰游戏解题思路本题背景比较新颖,但其实抽象出来就是字母R和D的淘汰游戏。给一个只包含R和D的字符串s。当遍历到该字母时,会淘汰掉排在它之后的另一字母。以下说明此题的几个TIPS:(分析时易陷入的误区)注意1:此处一定是淘汰掉在该字母之后的敌对字母。(因为要抵消掉后面敌对字母的淘汰权利,前面的敌对字母已经行使过淘汰权了。)当后面没有敌对字母时,才淘汰位于该字母之前的敌对字母。如果该字符串中不存在敌对字母,则该方“宣布胜利”。否则,会出现相反的结果原创 2020-09-29 18:00:12 · 219 阅读 · 0 评论 -
【Leetcode 402】详细解析 一般方法&单调栈方法 移掉k位数字
题目Leetcode 402 移掉k位数字解题思路本题可以从三个方法去解题。方法一:一般方法;方法二:单调栈方法三:(从string角度的)单调栈代码方法一:一般方法这是我看到这道题的第一反应。一开始,我以为只要将num中k个最大的数字逐一删去即可。后来发现此思路行不通,因为这样无法保证剩余的数字按照原来的相对顺序生成最小的数字。例如:num = 1432219, k=3时,得到的是1221 而不是最优的1219正确的思路应该是在num中逐步选取最小的数字,以组成最小的数字。而这原创 2020-09-29 17:55:54 · 251 阅读 · 0 评论 -
Leetcode 62 不同路径 递归/动态规划/数学法
题目Leetcode 62 不同路径解题思路这道题其实是高中数学中排列组合问题里面的典型问题。可以用多种方法求解。以下给出的方法效率都很高。有数学法、动态规划法、递归法。代码法一:数学法其实,本道题在排列组合问题中可化为求C(m+n-2,m-1)(或C(m+n-2,n-1))。即一共有m行n列,其中需要向下走m-1步,向右走n-1步,一共走m+n-2步。所以就是在m+n-2步中选出哪m-1步是向下走的,其余自动为向右走的步数。TIPS:本方法要注意计算组合数的时候要先化简,且要用unsi原创 2020-09-29 17:50:31 · 194 阅读 · 0 评论 -
Leetcode310 最小高度树 拓扑排序
题目Leetcode 310 最小高度树思路本题其实就是拓扑排序的变式。就是不断缩小图,直至剩下1、2个点,return。然而,此题的变式点如下:本题为无向图,所以删除的点是入度为1的点。本题不能一个一个的删除入度为1的点,而应在一个循环中,一次性删除入度为1的点,使得以同样的速度缩小图,直至剩下<=2个点为止。代码class Solution {public:vector<int> findMinHeightTrees(int n, vector<vect原创 2020-09-29 17:47:38 · 70 阅读 · 0 评论 -
【Leetcode 207】简洁易懂的课程表:拓扑排序
题目Leetcode 207 课程表思路课程表问题是最典型的拓扑排序。故此处展示拓扑排序解法。而这道题本质要判断的是:有向无权图中是否存在环。因此,可以用拓扑排序判断有无环。P.S.还可以用DFS来判断。https://blog.csdn.net/ywcpig/article/details/52599867代码class Solution {public: bool canFinish(int numCourses, vector<vector<int>>原创 2020-09-29 17:45:10 · 151 阅读 · 0 评论 -
【Leetcode 179】4ms 逆序对 int转string的快速方法!cmp位置总结!
题目Leetcode 179 最大数思路一开始是从数学角度,对各种情况分类讨论。后来发现,不如直接对字符串进行相加比较。算法的正确性本题难在算法的正确性证明。此处引入“逆序对”的概念。设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相同。如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 <A[i], A[j]> 这个有序对称为 A 的一个逆序对,也称作逆序数。而此处的逆序对,指存在i>j,使得原创 2020-09-29 17:40:43 · 131 阅读 · 0 评论 -
【Leetcode 147】C++ 插入排序 简洁易懂(小白版)
【Leetcode 147】C++ 插入排序 简洁易懂(小白版)解题思路题目link本来以为理解了数组的插入排序会很好写,谁知…下面是我的心路历程:首先,第一反应是像数组的插入排序一样,找到相应插入位置后将元素逐个后移,但发现这样复杂度过高。然后,为了降低复杂度,则要减少移动的次数:改变指针的指向!此题利用了dummyhead伪头指针,即构造一个指向head的指针,使得可以从head开始遍历。且由于指针在插入排序的过程中,所指向的元素在链表中的位置会发生改变,而dummyhead始终指向第一个原创 2020-09-29 17:30:53 · 124 阅读 · 0 评论