
算法与数据结构
文章平均质量分 92
此专栏收录个人在刷题过程中的一些总结、思考,仅用于个人复习与学习交流使用。
dby_freedom
Everythin has a good ending, if it's not, then it's not the end.
展开
-
算法与数据结构(二十五)TopK问题:基于快排的Python模板
首先,先写partition模板。原创 2023-12-04 09:35:05 · 699 阅读 · 0 评论 -
算法与数据结构(二十四)最优子结构原理和 dp 数组遍历方向
你看。原创 2023-08-14 09:37:24 · 1368 阅读 · 0 评论 -
算法与数据结构(二十三)动态规划设计:最长递增子序列
注:此文只在个人总结 labuladong 动态规划框架,仅限于学习交流,版权归原作者所有;也许有读者看了前文,学会了动态规划的套路:找到了问题的「状态」,明确了dp数组/函数的含义,定义了 base case;但是不知道如何确定「选择」,也就是找不到状态转移的关系,依然写不出动态规划解法,怎么办?。原创 2023-08-14 09:03:41 · 816 阅读 · 0 评论 -
算法与数据结构(二十二)动态规划解题套路框架
第一个斐波那契数列的问题,解释了如何通过「备忘录」或者「dp table」的方法来优化递归树,并且明确了这两种方法本质上是一样的,只是自顶向下和自底向上的不同而已。第二个凑零钱的问题,展示了如何流程化确定「状态转移方程」,只要通过状态转移方程写出暴力递归解,剩下的也就是优化递归树,消除重叠子问题而已。如果你不太了解动态规划,还能看到这里,真得给你鼓掌,相信你已经掌握了这个算法的设计技巧。计算机解决问题其实没有任何特殊的技巧,它唯一的解决办法就是穷举,穷举所有可能性。原创 2023-08-09 09:04:24 · 613 阅读 · 0 评论 -
算法与数据结构(二十一)前缀和数组&差分数组
前缀和数组适用场景:原始数组不会被修改的情况下,频繁查询某个区间的累加和;前缀和数组优势:前缀和数组是典型的空间换时间的解决方案,将 前缀和 进行便利存储(O(n) 时空复杂度),然后 O(1) 时间复杂度得到最终数组区间和;差分数组适用场景:差分数组的主要适用场景是频繁对原始数组的某个区间的元素进行增减;个人体感,差分数组的适用范围更广一些,尤其是针对问题的抽象如公交车&航班问题;原创 2023-07-23 15:54:13 · 442 阅读 · 0 评论 -
算法与数据结构(二十一)二叉树(纲领篇)
如果可以,写出这个递归函数的定义,并充分利用这个函数的返回值,这叫「分解问题」的思维模式。原创 2023-08-03 09:47:13 · 650 阅读 · 0 评论 -
算法与数据结构(二十)回溯法总结(排列)
在上一篇题解中,我总结了回溯算法的三种类型,以及什么时候用回溯算法,怎么写回溯算法,如果没看过的,强烈建议先看:C++ 总结了回溯问题类型 带你搞懂回溯算法(大量例题)下面就来讲解第二种类型——排列类型(ABC三道例题),此题(字符串全排列)为例题C,先上回溯六步走① 画出递归树,找到状态变量(回溯函数的参数),这一步非常重要② 根据题意,确立结束条件③ 找准选择列表(与函数参数相关),与第一步紧密关联④ 判断是否需要剪枝**⑤ 作出选择,递归调用,进入下一层⑥ 撤销选择1.全排列–问题描述原创 2022-05-03 11:40:04 · 1050 阅读 · 0 评论 -
算法与数据结构(十九)回溯法总结(子集&组合)
1. DFS 和回溯算法区别DFS 是一个劲的往某一个方向搜索,而回溯算法建立在 DFS 基础之上的,但不同的是在搜索过程中,达到结束条件后,恢复状态,回溯上一层,再次搜索。因此回溯算法与 DFS 的区别就是有无状态重置2.何时使用回溯算法当问题需要 “回头”,以此来查找出所有的解的时候,使用回溯算法。即满足结束条件或者发现不是正确路径的时候(走不通),要撤销选择,回退到上一个状态,继续尝试,直到找出所有解为止3.怎么样写回溯算法(从上而下,※代表难点,根据题目而变化)① 画出递归树,找到状态变量原创 2022-05-03 11:25:46 · 1449 阅读 · 0 评论 -
算法与数据结构(十八):硬币找零问题总结
一、 01硬币找零问题(01背包)给定不同面额的硬币 coins 和总金额 m。每个硬币最多选择一次。计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。状态表示f[i][j] 表示只看前 i 个物品,总价值是 j 的情况下的最小硬币数目。状态转移f[i, j] = min(f[i-1, j], f[i-1, j-ci] + 1) 分别对应了...原创 2019-10-05 13:33:28 · 2254 阅读 · 0 评论 -
算法与数据结构(十七):BFS, DFS 算法总结
BFS, DFS 算法总结BFS, DFS 作为算法题中一种常见题型,其解题方式相对固定,但其运算思想很巧妙,先总结与此。LeetCode 207. Course ScheduleThere are a total of n courses you have to take, labeled from 0 to n-1.Some courses may have prerequisites...原创 2019-10-04 20:49:10 · 694 阅读 · 2 评论 -
算法与数据结构(十六):Python 内建排序方法总结
Python 内建排序机制很强大,此处对其进行一个较为系统的使用总结。原创 2019-09-15 11:18:55 · 342 阅读 · 0 评论 -
算法与数据结构(十五):最大子序和算法总结
最大子序和算法经常遇到,虽然也能写出,但往往不能直接想到最优雅的写法,现总结与此,仅供学习交流使用。原创 2019-08-13 23:50:04 · 494 阅读 · 0 评论 -
算法与数据结构(十四):IO 模板总结(C++ & Python)
不少网络笔试不像 LeetCode 帮你完成 I/O,需要手动完成;个人深受其痛,现将常用的 IO 模板总结与此,分别总结了 C/C++ 和 Python 代码。原创 2019-08-02 20:57:12 · 1131 阅读 · 0 评论 -
算法与数据结构(十三):字符串反转题型总结
字符串反转总结字符串反转(如 “hello world” 转变为 “world hello”)作为一种常见题型,如果利用 python 作很简单,但是用 C++ 做往往需要考虑旋转、平移等策略,比较麻烦,这里对此类题型做一个小结。原创 2019-07-31 14:35:55 · 638 阅读 · 0 评论 -
算法与数据结构(十二):Jump Game 题型总结
Jump Game 总结Jump Game 作为一个系列题,对理解贪婪算法、DFS 都有较好的体现,现总结与此。原创 2019-07-18 14:45:51 · 499 阅读 · 1 评论 -
算法与数据结构(十一):Intervals 题型总结
Intervals 作为一种在面试中被问过两次的面试题型,现总结于此,该博文仅用于学习交流;原创 2019-07-05 21:20:19 · 1050 阅读 · 0 评论 -
算法与数据结构(十):排列与条件组合算法总结
排列、条件组合算法总结排列、组合问题作为一种经常出现在各类算法考核中的编程题,其思路较为固定,但是变形比较多,结合一些自身学习、思考,现总结如下。原创 2019-07-02 16:13:12 · 1945 阅读 · 0 评论 -
算法与数据结构(九):最佳买卖股票总结
最佳买卖股票总结买卖股票问题作为 LeetCode 中一类题,其思想很有指导意义,现总结如下;原创 2019-07-01 14:59:42 · 909 阅读 · 0 评论 -
算法与数据结构(八):构建二叉树总结
利用前序、中序(后序)构建二叉树想起最近做到的两道利用前序、中序以及利用中序、后序构建二叉树的题,其也广泛出现在面试题中的选择题中,现整理总结如下。原创 2019-07-01 10:23:05 · 368 阅读 · 0 评论 -
算法与数据结构(七):二分查找法总结
二分查找法作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围,大大缩短了搜索时间,具有很大的应用场景,而在LeetCode中,要运用二分搜索法来解的题目也有很多,但是实际上二分查找法的查找目标有很多种,而且在细节写法也有一些变化。原创 2019-07-14 23:55:20 · 1215 阅读 · 0 评论 -
算法与数据结构(六):旋转有序数组搜索总结
旋转有序数组搜索总结LeetCode 上两道很经典的旋转数组二分查找,对于理解二分查找以及旋转数组查找指定元素都是极其有意义的,现总结于此,仅供自身复习及交流分享。原创 2019-06-30 16:15:11 · 664 阅读 · 0 评论 -
算法与数据结构(五):Manacher's Algorithm 马拉车算法总结
继 KMP 算法之后顺便总结一下马拉车算法,总结与此,仅供自身复习与知识分享所用。这个马拉车算法Manacher‘s Algorithm是用来查找一个字符串的最长回文子串的线性方法,由一个叫Manacher的人在1975年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这是非常了不起的。对于回文串想必大家都不陌生,就是正读反读都一...原创 2019-06-21 14:24:43 · 533 阅读 · 0 评论 -
算法与数据结构(四):KMP 算法总结
看了很多遍 KMP 算法,总是似是而非,顾记录博客,总结与此,仅供自身复习与知识分享所用。原创 2019-06-20 22:13:59 · 514 阅读 · 0 评论 -
算法与数据结构(三):回溯法理论、应用及模板(排列、组合)
原理初入门有时会遇到这样一类题目,它的问题可以分解,但是又不能得出明确的动态规划或是递归解法,此时可以考虑用回溯法解决此类问题。回溯法的优点 在于其程序结构明确,可读性强,易于理解,而且通过对问题的分析可以大大提高运行效率。但是,对于可以得出明显的递推公式迭代求解的问题,还是不要用回溯法,因为它花费的时间比较长。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。可...原创 2018-10-03 20:53:01 · 1671 阅读 · 0 评论 -
算法与数据结构(二):动态规划(DP)总结
1. 最长公共子序列题目描述对于两个字符串,请设计一个高效算法,求他们的最长公共子序列的长度,这里的最长公共子序列定义为有两个序列U1,U2,U3…Un和V1,V2,V3…Vn,其中Ui<Ui+1,Vi<Vi+1。且A[Ui] == B[Vi]。给定两个字符串A和B,同时给定两个串的长度n和m,请返回最长公共子序列的长度。保证两串长度均小于等于300。测试样例:...原创 2019-04-21 22:44:50 · 1030 阅读 · 0 评论 -
算法与数据结构(一):滑动窗口法总结
滑窗法在算法题中大量应用,其思想简洁强大,但是往往在维护左右指针时候容易出错,现总结整理如下:原创 2019-10-16 23:32:28 · 60816 阅读 · 7 评论 -
排序算法总结(Python版)
经典排序算法总结与实现经典排序算法在面试中占有很大的比重,也是基础,为了未雨绸缪,在寒假里整理并用Python实现了七大经典排序算法,包括冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序。希望能帮助到有需要的同学。原创 2019-07-24 23:47:43 · 25005 阅读 · 13 评论 -
排序算法(1) -- 冒泡排序
一、前言冒泡排序是一种交换排序。什么是交换排序呢?答曰:两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序要求为止。二、算法思想它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端,故名冒泡排序。...原创 2019-02-27 10:29:20 · 447 阅读 · 0 评论 -
排序算法(2) -- 选择排序
一、前言简单选择排序是一种选择排序。选择排序:每趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止。二、算法思想简单排序很简单,它的大致处理流程为:从待排序序列中,找到关键字最小的元素;如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束。动...原创 2019-02-27 10:31:04 · 672 阅读 · 0 评论 -
排序算法(3) -- 插入排序
一、前言直接插入排序(Insertion Sort)序是一种最简单的插入排序。为简化问题,我们下面只讨论升序排序。二、算法思想插入排序:每一趟将一个待排序的记录,按照其关键字的大小插入到有序队列的合适位置里,知道全部插入完成。动态效果示意图:以上的过程,其实就是典型的直接插入排序,每次将一个新数据插入到有序队列中的合适位置里。很简单吧,接下来,我们要将这个算法转化为编程语言。假设有...原创 2019-02-27 09:59:00 · 430 阅读 · 0 评论 -
排序算法(4) -- 希尔排序
一、前言希尔(Shell)排序又称为缩小增量排序,它是一种插入排序。它是直接插入排序算法的一种威力加强版。希尔排序,也称递减增量排序算法,以其设计者希尔(Donald Shell)的名字命名,该算法由 1959 年公布。二、算法思想我们举个例子来描述算法流程(以下摘自维基百科):假设有这样一组数 {13, 14, 94, 33, 82, 25, 59, 94, 65, 23, 45, 2...原创 2019-02-27 10:19:26 · 648 阅读 · 0 评论 -
排序算法(5) -- 快速排序
一、前言快速排序是一种交换排序,它由C. A. R. Hoare在1962年提出。二、算法思想快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数。然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。动态效果示意图:详细的图解往往比大堆的文字更有说明力,所以直接上图:上图...原创 2019-02-27 09:36:40 · 516 阅读 · 0 评论 -
排序算法(6) -- 堆排序
排序(6):堆排序一、前言堆排序是一种选择排序。选择排序:每趟从待排序的记录中选出关键字最小的记录,顺序放在已排序的记录序列末尾,直到全部排序结束为止。二、算法思想堆排序是利用堆的性质进行的一种选择排序。动态效果示意图:堆是一棵顺序存储的完全二叉树。其中每个结点的关键字都不大于其孩子结点的关键字,这样的堆称为小根堆。其中每个结点的关键字都不小于其孩子结点的关键字,这样的堆称为...原创 2019-02-27 08:13:11 · 1067 阅读 · 0 评论 -
排序算法(7) -- 归并排序
一、前言归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用**分治法(Divide and Conquer)**的一个非常典型的应用。二、算法思想该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而**治(conquer)**的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。动态效果示意图:分...原创 2019-02-26 20:26:26 · 510 阅读 · 1 评论 -
排序算法(8) -- 桶排序、计数排序和基数排序
桶排序、计数排序和基数排序这三种算法的时间复杂度都为 O(n)O(n)O(n),因此,它们也被叫作线性排序(Linear Sort)。之所以能做到线性,是因为这三个算法是非基于比较的排序算法,都不涉及元素之间的比较操作。1. 桶排序(Bucket Sort)1.1. 桶排序原理桶排序,顾名思义,要用到“桶”。核心思想是将要排序的数据分到几个有序的桶里,每个桶的数据再单独进行排序。桶内排...原创 2019-02-27 08:47:17 · 1589 阅读 · 2 评论 -
经典排序算法优劣比较(总结)
1. 冒泡排序冒泡排序是最简单的排序之一了,其大体思想就是通过与相邻元素的比较和交换来把小的数交换到最前面。这个过程类似于水泡向上升一样,因此而得名。举个栗子,对5,3,8,6,4这个无序序列进行冒泡排序。首先从后向前冒泡,4和6比较,把4交换到前面,序列变成5,3,8,4,6。同理4和8交换,变成5,3,4,8,6,3和4无需交换。5和3交换,变成3,5,4,8,6,3.这样一次冒泡就完了,把...原创 2018-10-20 13:46:26 · 2590 阅读 · 0 评论