算法
文章平均质量分 76
chenf99
这个作者很懒,什么都没留下…
展开
-
Bellman-Ford、Dijkstra、Floyd算法
文章目录Bellman-Ford算法解决的问题思路leetcode例题Dijkstra算法解决的问题思路leetcode例题Floyd算法解决的问题思路leetcode例题Bellman-Ford算法Bellman-Ford用于找出单源最短路径,即从源节点到图中每个节点的最短路径,支持边权重为负的情况。算法利用了动态规划的思想,实现简单,但时间复杂度为O(VE)O(VE)O(VE),非常高。解决的问题从A出发是否可以到达各个节点从A出发到达各个节点的最短路径图中是否存在负环路(权重之和为负数原创 2021-03-15 15:09:11 · 1238 阅读 · 0 评论 -
[leetcode题解] 第995题Minimum Number of K Consecutive Bit Flips
https://leetcode-cn.com/problems/minimum-number-of-k-consecutive-bit-flips/文章目录分析差分数组解法代码分析不难想到这样一种解法:依次遍历数组A,如果A[i] == 0,第i个位置就需要翻转。此时若i + K > n,则无法实现翻转,返回-1;否则手动修改数组A[i: i+K-1],再遍历下一个位置。在这个过程中直接统计出总的翻转次数即为答案。这个解法虽然直观,但是时间复杂度为O(nK)O(nK)O(nK),不是一个好的原创 2021-02-18 23:38:09 · 279 阅读 · 1 评论 -
[leetcode题解] 第480题Sliding Window Median
https://leetcode-cn.com/problems/sliding-window-median/文章目录分析分析原创 2021-02-03 17:53:13 · 330 阅读 · 0 评论 -
[leetcode题解] 第1202题Smallest String With Swaps
https://leetcode-cn.com/problems/smallest-string-with-swaps/文章目录分析解法并查集排序思路一排序思路二排序思路三分析需要把这道题看成图论的题目才好做:将字符串中的索引视为图的节点,一个pair对意味着两个节点之间存在一条无向边。那么答案就可以这样来得到:对无向图中的每个连通分量所代表的字符串分别进行排序,再把字符按照索引填入原位置。这是因为交换具有传递性,即a与b可交换,b与c可交换,那么a一定可与c交换(交换次数不受限制)。因此在连通分量原创 2021-01-13 16:43:19 · 190 阅读 · 0 评论 -
局部搜索解千万级别N皇后问题
作业10题目局部搜索解n皇后,并测试n的极限实验v0v0版本我实现了最基本的局部搜索算法,该版本解n=1000n=1000n=1000需要超过777分钟,n=10000n=10000n=10000时间太长,超过极限。 状态的表示首先,使用哪种数据结构表示n皇后问题的一个状态是很重要的,直接影响到算法的效率。我使用一个一维数组来表示状态,i, board[i]表示一个皇后的行、列位置。初始时要随机生成一个状态,此时就可以解决掉所有行和列上的冲突,即保证每一行、每原创 2021-01-01 15:02:54 · 2306 阅读 · 5 评论 -
[leetcode题解] 第1648题Sell Diminishing Valued Colored Balls
https://leetcode-cn.com/problems/sell-diminishing-valued-colored-balls/文章目录分析解法一代码:解法二代码分析很容易找到这道题的贪心策略:每次卖出价值最大(数目最多)的那种球。我们可以使用最大堆来辅助获取最大的inventory[i],把它加到ans后再把inventory[i] - 1放回堆中,同时orders--。这种思路很简单,但效率太低了,时间复杂度为O(orders⋅logn)O(orders\cdot logn)O(o原创 2020-11-09 11:22:56 · 668 阅读 · 0 评论 -
[leetcode题解] 剑指offer20:表示数值的字符串
https://leetcode-cn.com/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/submissions/文章目录分析解法代码分析这道题主要考察思维全面性和编程能力,如果不能归纳出所有的案例,编码时就要处理各种细节,难以写出高质量的代码。举几个例子:3.2e+9、3.e9、.e8、+.3e-2这些都是有效的数值。乍一看很难理解,但只要我们明白数值由整数部分、小数部分、指数部分组成就容易理解了。去除字符串首尾的空格后,表示数值的字符串模式为原创 2020-10-17 10:52:54 · 131 阅读 · 0 评论 -
leetcode题解:剑指offer14: 剪绳子
https://leetcode-cn.com/problems/jian-sheng-zi-lcof/文章目录解法一代码解法二解法一这道题属于动态规划的经典面试题,考虑dp[i]表示对i进行划分得到的最大乘积,注意:dp[i]不一定大于i。因此将n划分为i和n-i后,我们要判断是否需要继续对i和n-i进行划分。注意:只需要在[1, n/2]的范围内寻找i,这样可以节省时间。代码class Solution { public int integerBreak(int n) {原创 2020-10-11 21:51:49 · 220 阅读 · 0 评论 -
卡特兰数通项公式详细推导过程
设法求解下面这个递归式或给出其最低上界的阶,设P(1)=1P(1)=1P(1)=1P(n)=∑k=1n−1P(k)P(n−k)\large{P(n)=\sum^{n-1}_{k=1}P(k)P(n-k)}P(n)=k=1∑n−1P(k)P(n−k)易知P(n)P(n)P(n)就是卡特兰数,下面用生成函数法求解出其通项公式。设生成函数为:g(x)=h(1)x+h(2)x2+...+h(k)xk+...\large{g(x)=h(1)x+h(2)x^2+...+h(k)x^k+...}g(x原创 2020-09-22 20:43:14 · 6621 阅读 · 2 评论 -
详解leetcode石头合并问题
https://leetcode-cn.com/problems/minimum-cost-to-merge-stones/文章目录分析区间动态规划三部曲分析这道题是一道经典的区间dp问题,旨在通过动态规划去求一个区间的最优解,通过将大区间划分为很多个小区间,再由小区间的解来组合出大区间的解,这体现了分支的思想。区间动态规划三部曲定义状态:dp[i, j]为区间[i, j]的最优解定义状态转移方程:最常见的写法为:dp[i,j] = max/min{dp[i,j], dp[i, k] + dp原创 2020-08-30 17:00:23 · 996 阅读 · 0 评论 -
leetcode题解:第301题Remove Invalid Parentheses
https://leetcode-cn.com/problems/remove-invalid-parentheses/文章目录解法一、BFS代码解法二、回溯代码解法三、有限制的回溯代码解法一、BFS这题要求所有的解,所以我们应当想到用搜索来解决,BFS的思想会比较直观:由题目要求易知:所有的解都是由原始字符串删除了相同数量的括号得到的对于删除的括号数量i,生成对应的所有的字符串,它们属于第i个level对于每个level,判断其中的字符串是否有解:若有,则所有的解都来自于这个level;否则原创 2020-08-26 09:55:23 · 395 阅读 · 0 评论 -
leetcode题解:第399题Evaluate Division
https://leetcode-cn.com/problems/evaluate-division/分析这道题的目的很明确,逻辑也容易理解,人可以很容易地计算出这种方程式的结果,但怎么把这种方程式在程序中表示是一个难题。换言之,正确地表示方程式,就能把这个看似难处理的问题转换成容易解决的问题。解法一、图遍历如果给出提示,把这题与图联系起来,能否快速找到解决办法呢?我们可以很自然地想到,可以用带权图来表示输入的所有方程式:a / b = value表示两条边:a->b,权重为value和b-原创 2020-08-22 23:14:48 · 278 阅读 · 0 评论 -
堆排序详解
上文提到的leetcode第215题除了快速排序的二分partition解法,还可以用堆排序来解决,小小一道medium题居然汇集了快排和堆排这两位卧龙凤雏,实属难得。文章目录数据结构-堆完全二叉树堆堆排序思想构造大根堆代码数据结构-堆完全二叉树首先,堆是一棵完全二叉树,因此其具备完全二叉树的全部特点:除了最后一层外,其余层的节点数都达到最大值,而最后一层的节点都集中在左边。节点的编号与其对应的满二叉树中节点编号相同若最后一个非叶子节点的编号为i,则编号0~i的节点都是非叶子节点,编号i+1原创 2020-08-12 19:59:25 · 652 阅读 · 0 评论 -
Partition算法详解
partition算法有着非常重要的应用,这个算法的思想虽然简单,但具体实现的细节却比较多,今天我重点复习了这个算法,本文记录我对这个算法的理解。文章目录Partition算法解析二分Partition三分Partition二分Partition应用时间复杂度代码三分Partition应用代码Partition算法解析二分Partition快速排序作为非常著名的排序算法,其思想却很简单:每次从数组中选一个数作为pivot,然后将数组划分为2部分,小于等于pivot数的在其左边,大于等于pivot的数原创 2020-08-11 17:05:54 · 3700 阅读 · 0 评论 -
leetcode题解:第142题Linked List Cycle II
https://leetcode-cn.com/problems/linked-list-cycle-ii/文章目录分析解法、双指针代码复杂度分析分析这道题在第141题环形链表的基础上,不仅要求判断链表是否有环,还要求在有环的情况下给出入环的节点。如果用哈希表的话,自然与第141题解法相同,但那并不是这种题目的本意。单纯用双指针,只能判断是否有环,但快慢指针的相遇点并不一定在入环处,需要巧妙地改进双指针的解法来完成本题。解法、双指针链表无环时自不必说,当链表有环时,我们分两个阶段来解决这个问题:原创 2020-08-07 23:08:49 · 158 阅读 · 0 评论 -
leetcode题解:第139题Word Break
https://leetcode-cn.com/problems/word-break/文章目录解法一、回溯代码解法二、动态规划代码复杂度分析解法一、回溯依照惯例,没有好的思路的时候,就先想想暴力解法怎么做。暴力解法无非是逐个单词地拆分字符串,每次选的单词可以重复。要实现暴力解法的话,肯定就是用回溯,因为回溯算法“撤销选择”的特点,保证了每次都能考虑到所有的单词。简而言之,对于字符串s和单词word,word长度为n,当word与s[:n]相同时,就可以把word选来进行一次拆分,紧接着继续判断s[原创 2020-08-07 20:40:58 · 387 阅读 · 0 评论 -
leetcode题解:第105题Construct Binary Tree from Preorder and Inorder Traversal
https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/文章目录解法一、递归代码复杂度分析解法二、迭代解法一、递归前序遍历的序列组成形式为:根, {左子树前序结果}, {右子树前序结果}中序遍历的序列组成形式为:{左子树中序结果}, 根, {右子树中序结果}把上面这两行写出来,递归解法就很容易想到了。很明显,我们需要知道左子树的节点个数,才好获取到左子树的前序结果。由于树原创 2020-08-05 22:48:02 · 216 阅读 · 0 评论 -
leetcode题解:第79题Minimum Window Substring
https://leetcode-cn.com/problems/minimum-window-substring/文章目录解法代码复杂度分析解法题意很容易理解,需要注意输入的T不会是空串,T中的字符有可能重复。对于子串问题,常用滑动窗口算法来解决滑动窗口算法的框架如下:int left = right = 0while right < s.size() { window.add(s[right]) while (window meed shrink) window.remove(s[原创 2020-08-02 17:28:37 · 157 阅读 · 0 评论 -
leetcode题解:第39题Combination Sum
https://leetcode-cn.com/problems/combination-sum/submissions/文章目录分析解法代码分析这道题也是典型的回溯算法代表题,题目要求找到所有的解,每一个解都是由候选数组中的元素组成的,因此我们可以利用回溯算法,一次将一个元素加入到组合中,再判断组合是否是一个解。在回溯过程中还需要剪枝,剪掉不可能找到解的分支和会产生重复解的分支。解法最容易想到的方法,把候选数组中的元素一个个加入到组合中,然后计算组合中所有元素之和:如果大于目标数,则这个搜索分支原创 2020-07-28 12:49:41 · 166 阅读 · 0 评论 -
leetcode题解:第22题Generate Parentheses
https://leetcode-cn.com/problems/generate-parentheses/submissions/文章目录解法一代码复杂度分析解法二代码复杂度分析解法三代码解法一采用暴力解法,即找出所有可能的组合,挑选出其中有效的作为答案。一共有n对括号,也即字符串长度为2n,每个位置2个选择,所以一共有22n2^{2n}22n个可能的组合。如何生成所有可能的组合?采用递归的深度优先搜索是最方便有效的方法。搜索的最大深度就是2n,此时判断组合 是否有效并添加到答案中。如何判原创 2020-07-22 21:02:00 · 209 阅读 · 0 评论 -
二叉树的前序遍历、中序遍历、后序遍历迭代实现
遍历树有DFS和BFS两种方法,而DFS又因为输出节点的先后顺序分为了3种,采用递归来实现前、中、后序遍历非常简单,本文记录一下这3种遍历的迭代实现。要点:树的前、中、后序遍历迭代实现要借助栈这个数据结构。以下面这棵树为例:前序遍历leetcode第144题:https://leetcode-cn.com/problems/binary-tree-preorder-traversal/前序遍历就是当访问到一个节点时,先输出该节点内容,再分别去访问其左右子节点。例子的遍历结果为:[1,4,2,3原创 2020-07-22 10:41:33 · 342 阅读 · 0 评论 -
leetcode题解:第15题3 Sum
https://leetcode-cn.com/problems/3sum/分析这道题与Two Sum很像,我们很容易想到利用Two Sum的程序来解答这个问题,对于a+b+c = 0,有-c = a+b,这相当于target设置为-c的Two Sum问题。区别在于,a和b的值不是唯一的,即这个Two Sum的答案不唯一。除了找到所有正确的a和b外,还要解决三元组重复的问题。解法一我们依然考虑在Two Sum的基础上解决这个问题。首先,Two Sum的核心代码是:for (int i = 0;原创 2020-07-20 15:37:43 · 128 阅读 · 0 评论 -
leetcode题解:第11题Container With Most Water
https://leetcode-cn.com/problems/container-with-most-water/分析这道题乍一看与接雨水那道题很像,但那题是求总共能接到的水量,这题则是要求两个边界组成的容器的最大容量。暴力解法是枚举所有的左右边界,计算其容器的容量,再取最大值,时间复杂度为O(n2)O(n^2)O(n2),超时了。解法这道题要用双指针来解答, 如果给你双指针这个提示的话,你应该会容易想到每次移动更矮的那个边界会是正确的做法,但是怎么证明呢?对于所有的这些线,它们都有可能作为一原创 2020-07-19 11:46:22 · 171 阅读 · 0 评论 -
leetcode题解:第10题Regular Expression Matching
https://leetcode-cn.com/problems/regular-expression-matching/分析这道题的难点在于存在a*这样的组合,如何处理与这种组合匹配的字符数是很棘手的问题,例如:s = "aaa", p = "aa*"s = "baaa", p = "ba*"第一个例子中a*匹配2个字符,第二个例子中a*匹配3个字符。可以看出,匹配的字符数不仅与s有关,还与p中组合前面的字符有关(后面也有可能)。如果是.*这样的组合,会更加麻烦。我一开始的想法是用双指针分别原创 2020-07-18 17:27:45 · 181 阅读 · 0 评论 -
leetcode题解:第300题Longest Increasing Subsequence
https://leetcode-cn.com/problems/longest-increasing-subsequence/这道题是动态规划的典型例题,有O2O^2O2和O(nlogn)O(nlogn)O(nlogn)两种解法。解法一O(n2)O(n^2)O(n2)的解法比较容易想到,要找最长的上升子序列,我们维护一个dp[n]数组,用dp[i]来表示以第i个元素为结尾的最长上升子序列长度,例题中dp[0] = 1, dp[3] = 2。如何更新这个数组呢?按照定义,我们肯定要更新所有的dp[i原创 2020-07-17 11:01:50 · 204 阅读 · 0 评论 -
leetcode题解:第5题Longest Palindromic Substring
https://leetcode-cn.com/problems/longest-palindromic-substring/解法一采用动态规划的思路来优化暴力解法。暴力解法自然是找出所有的子串然后判断是否是回文串,子串可以用其开头start和结尾end两个变量来表示。找到所有子串这个过程是没法优化的,因此我们要思考如何优化判断回文串这个过程。对于dp[start][end],必须满足end >= start(首尾不能颠倒):易知start == end时dp[start][end] =原创 2020-07-16 15:26:20 · 162 阅读 · 1 评论 -
leetcode题解:第169题Majority Element
https://leetcode-cn.com/problems/majority-element/解法一最容易想到的解法,用哈希表存下每个元素出现的次数,当次数超过n/2时,找到答案,算法效率也高,复杂度均为O(n)O(n)O(n)。class Solution {public: int majorityElement(vector<int>& nums) { unordered_map<int, int> count; fo原创 2020-07-14 21:30:30 · 177 阅读 · 0 评论 -
leetcode题解:第236题Lowest Common Ancestor of a Binary Tree
https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/解法一本题意在为两个节点找到最近的共同祖先,我们需知两点来完成这个任务:除非另找存储结构,树只能从root开始从上往下遍历,一般采用递归完成如何判断一个节点是否是p或q的祖先要判断是否为祖先,我们可以利用递归的特性,当遇到p或q时,返回值为真,再一层层送上去,就找到了其祖先。本题自然也需利用递归完成,但要求返回的值是TreeNode*类型,不是bo原创 2020-07-14 21:10:06 · 182 阅读 · 0 评论 -
leetcode题解:第1题Two Sum
https://leetcode-cn.com/problems/two-sum/分析题目意思很明确,不考虑算法效率的话,这道题可以很容易用暴力解法做出来,两层循环获取两个整数,判断和是否等于目标值即可,时间复杂度为O(n2)O(n^2)O(n2)。解法为了得到更好的算法,我们转变思路,不是直接找两个整数然后判断它们的和,而是考虑对一个整数n,判断target-n是否在数组中,如果在,答案就是它们俩的下标。判断一个数是否存在于数组中的最好办法就是哈希表,所以我们要将数组转变为哈希表,key为数组元原创 2020-07-11 13:49:39 · 251 阅读 · 0 评论 -
leetcode题解:第42题Trapping Rain Water
题目Trapping Rain WaterGiven n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.The above elevation map ...原创 2019-07-20 15:05:03 · 220 阅读 · 0 评论 -
leetcode题解:第32题Longest Valid Parentheses
题目Longest Valid ParenthesesGiven a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.Example1Input: "(()"Output: 2Expl...原创 2019-07-20 15:04:27 · 202 阅读 · 0 评论 -
leetcode题解:第31题Next Permutation
题目Next PermutationImplement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.If such arrangement is not possible, it must rearrange it as t...原创 2019-07-20 15:03:56 · 212 阅读 · 0 评论 -
leetcode题解:第25题Reverse Nodes in k-Group
题目Reverse Nodes in k-GroupGiven a linked list, reverse the nodes of a linked list k at a time and return its modified list.k is a positive integer and is less than or equal to the length of the li...原创 2019-07-20 15:03:25 · 188 阅读 · 0 评论 -
leetcode题解:第23题Merge k Sorted Lists
题目Merge k Sorted ListsMerge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.Example:Input:[ 1->4->5, 1->3->4, 2->6]Output: 1-&...原创 2019-07-20 15:02:53 · 193 阅读 · 0 评论 -
leetcode题解:第4题Median of Two Sorted Arrays
题目Median of Two Sorted ArraysThere are two sorted arrays nums1 and nums2 of size m and n respectively.Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n...原创 2019-07-20 15:02:14 · 178 阅读 · 0 评论 -
一招教你给leetcode submission提速
今天在写leetcode上的Maximal Rectangle这一道题时,我发现一个人的8ms解答跟我的16ms解答方法是一样的,复杂度也是一样的,但是为啥他比我快了一倍呢?我仔细查看他的代码,发现了这么一段:static int x = []() { ios::sync_with_stdio(false); cin.tie(NULL); return 0; }();这段代...原创 2018-11-24 20:04:43 · 3191 阅读 · 0 评论 -
leetcode题解:第72题Edit Distance
题目Edit DistanceGiven two words word1 and word2, find the minimum number of operations required to convert word1 to word2.You have the following 3 operations permitted on a word:Insert a characte...原创 2019-07-20 15:05:37 · 314 阅读 · 0 评论 -
leetcode题解:第84题Largest Rectangle in Histogram
题目Largest Rectangle in HistogramGiven n non-negative integers representing the histogram’s bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.Above i...原创 2019-07-20 15:06:12 · 514 阅读 · 0 评论 -
leetcode题解:第85题Maximal Rectangle
题目Maximal RectangleGiven a 2D binary matrix filled with 0’s and 1’s, find the largest rectangle containing only 1’s and return its area.Example:Input:[ ["1","0","1","0","0"], ["1","0","1","1...原创 2019-07-20 15:07:05 · 197 阅读 · 0 评论 -
leetcode题解:第128题Longest Consecutive Sequence
题目Longest Consecutive SequenceGiven an unsorted array of integers, find the length of the longest consecutive elements sequence.Your algorithm should run in O(n) complexity.Example:Input: [100...原创 2019-07-20 15:09:06 · 280 阅读 · 0 评论