Algorithm
文章平均质量分 72
崔显龙
简约至上
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
赛马问题分析
最坏情况:C2全场第2名,C3全场第3名,则还需要C4与此时全场第4名进行一场比赛,确定最终的全场第4名,共计比赛11场。若J2未获取第2名,则需要J3与当前第3名进行第12场比赛,决出第3名(即全场第4名),共计12场;最好情况:C3未获得全场前3名位置,则C4必定不是全场前4名,则比赛结束,共计比赛10场;若全程都是情况三(最坏情况),则需要增加3场比赛,得出第2-4名次,最终比赛12场;保留:C2有可能成为第2-4名,C3有可能成为第3-4名,C4有可能成为第4名。原创 2020-08-20 22:22:26 · 1159 阅读 · 0 评论 -
图论-广度遍历:单词接龙
给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。你可以假设 beginWord 和 endWord 是非空的,且二者不相同。中文版 LeetCode 127题 - 单词接龙 问题。转换过程中的中间单词必须是字典中的单词。如果不存在这样的转换序列,返回 0。每次转换只能改变一个字母。所有单词只由小写字母组成。(源自LeetCode)所有单词具有相同的长度。字典中不存在重复的单词。原创 2019-08-05 14:53:49 · 428 阅读 · 1 评论 -
链表:快慢指针
快慢指针法是链表算法中常用的一种方法,通过两个步长不同的移动指针,可以帮助解决一些链表中的问题。通常,慢指针每次移动一个节点,快指针每次移动两个节点,因此,二者的路径存在一个二倍的数学关系(偶数节点情况下)。原创 2019-07-09 13:41:49 · 1963 阅读 · 2 评论 -
最小堆:TopK问题
在解决TopK问题时,综合各方面考虑,最小堆方案比较好,其时间复杂度为O(n*lgK),空间复杂度为O(K)。(1)构造一个大小为K的最小堆,用于存储当前TopK元素,堆顶为TopK元素中最小的元素,即第K个元素;由于空间复杂度取决于K值,因此,可应用于大量流数据的TopK问题(无法将全部数据载入内存的情况)。(2)每读入一个元素,与堆顶元素比较,若大于堆顶元素,则替换堆顶元素,并将新的堆顶元素进行排序。原创 2019-06-13 16:16:23 · 1801 阅读 · 2 评论 -
状态机:只出现一次的数字II
以二进制数的角度考虑每一个数组元素,统计每一个二进制位上出现1的次数并对3取模(相当于:重复元素出现3次会被抵消清零),最终可以得到只出现一次的元素的二进制位情况,例如:对于 [ 9, 2, 2, 3, 2, 9, 9] 数组,其二进制位统计情况如表所示。通过观察,对于 nb1 的关系表达式,有公共项 ~ob2 可以提取,即 nb1 = ~ob2 & (ob1 & ~input | ~ob1 & input)注释:标红部分为计数增加的情况,由于取值范围为 0-2,因此,2 + 1 = 0。原创 2019-05-26 19:42:12 · 777 阅读 · 1 评论 -
动态规划:单词拆分
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被拆分为一个或多个在字典中出现的单词。(2)然后,从剩余部分开始,继续遍历寻找子字符串,若某子串str2为字典里的某个单词,则str1+str2部分满足条件;(1)首先,从开始位置,遍历寻找子字符串,若某子串str1为字典里的某个单词,则str1部分满足条件;其中,绿色部分表示当前步骤找到的满足条件的子字符串,黑色部分表示之前步骤确定的满足条件的子字符串部分。下面,通过图解方式,来描述该问题的动态规划思路。原创 2019-05-16 19:46:59 · 1932 阅读 · 1 评论 -
回溯算法(试探算法)
以此类推,当最后一个满足条件的子字符串结束位置正好在原字符串 s 结尾处,则表示正好将原字符串 s 分割为多个回文子串,即该分割方案是满足条件的一个解。)是一种按指定策略遍历所有可能路径的方法,在遍历的过程中,找出所有满足条件的解。每走一步,判断当前情况是否满足条件,若满足条件,则在该路径上继续试探,若不满足条件,则回溯(回退)至上一步,然后换一条路径继续试探。例题:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。由于该题需要找到所有满足条件的方案,因此,使用回溯算法进行求解。原创 2019-05-16 10:48:25 · 1157 阅读 · 1 评论 -
异或(^)的性质与应用
本文目录1 基本概念2 异或应用3 相关文章1 基本概念1.1 符号异或是一种二进制的位运算,符号以XOR 或 ^ 表示。1.2 运算规则相同为0,不同为1,即1 ^ 1 = 00 ^ 0 = 01 ^ 0 = 1由运算规则可知,任何二进制数与零异或,都会等于其本身,即 A ^ 0 = A。1.3 异或性质(1)交换律: ...原创 2019-05-10 16:06:28 · 127790 阅读 · 12 评论 -
动态规划:鸡蛋掉落
你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X <= N)。通过上述方案,可以找到题目的答案,但是,无法通过 LeetCode 检测,因为耗时超过限制。由于鸡蛋的数量在寻找过程中是变化的,即某一步骤的鸡蛋数量,取决于前一步骤的鸡蛋是否破碎。,因此,对于 1 <= X <= N 的所有解,应该取最小的一个解,即。原创 2019-05-15 13:48:57 · 3207 阅读 · 1 评论 -
位运算:减法与补码
为保证运算操作简单,计算机处理器被设计为只能进行加法操作,因此,需要将减法操作转为加法操作。由于取模计算特性可知,对于减法操作,可以找到一个相应的正数,通过加上这个正数,到达与原减法操作结果相同的刻度位置。而这个正数值,正是原负数的补码的数值部分。由于一个刻度位置,可对应正负两个数值(仅考虑合法范围内的数值),因此,需要通过符号位来确定最终结果。原创 2018-01-27 12:44:01 · 3958 阅读 · 0 评论 -
全排列(Java)
例如:对一组名字["小明","小红","小刚","小雷"]进行排列,可以转化为对String[]数组的下标[0,1,2,3]进行排列,得到了下标的排列情况,即得到了名字的排列情况。但是,无论排列目标是什么,都可以将其转化为对数组下标的排列,从而,将问题变成对一组自然数的排列。假设要求解[1,2,3,4,5]的全排列,则可以嵌套循环5次,每个循环对应一个位置,从而遍历出所有的情况。=5*4*3*2*1=120种情况。例如:[1,2,3,4,5] 或 [5,4,3,2,1] 或 [1,3,5,2,4] 等等。原创 2017-07-29 05:58:25 · 2583 阅读 · 1 评论 -
图解:常用排序算法(冒泡、选择、插入、希尔、快速、归并、堆)
插入排序只交换相邻的元素,在大规模乱序情况下,极有可能发生某个元素从某一端逐位交换至另一端,严重影响效率。希尔排序的思路是:先进行远距离跨越交换,从而使得元素尽快靠近最终位置,达到部分有序的目的,然后,再进行插入排序(当H=1时)。:首先,选择一个元素,将其余元素分成三部分,一部分小于该元素,一部分大于该元素,一部分等于该元素。:将完全二叉树的结点,按照层级顺序,将每一层的结点,从左至右放入数组中,且下标从1开始,即根节点的下标为1位置。:不稳定(排序后,相同元素的相对位置可能发生变化)原创 2017-09-11 07:00:44 · 1790 阅读 · 1 评论
分享