
算法
I am zzxn
https://github.com/zzxn
展开
-
自动求解最优输运问题的笔记
最优输运问题本质上就是求解:γ=arg minγ∑i,jγi,jMi,j\gamma = \argmin_\gamma{\sum_{i, j}{\gamma_{i, j}M_{i, j}}}γ=γargmini,j∑γi,jMi,j使得:γ1=aγT1=bγ≥0\gamma 1 = a \newline\gamma^T 1= b \newline\gamma\geq 0 \newlineγ1=aγT1=bγ≥0上面公式中的MMM是cost矩阵(dim_a × dim_b),aa原创 2020-08-06 01:23:30 · 1103 阅读 · 0 评论 -
算法题 颜色分类 一趟遍历Java解法
题目来源于LeetCode。最简单的方法是两趟的,但是如果要求一趟完成,那么这道题的解法是和三路快速排序的做法是一模一样的。在三路快速排序中,我们维护三个指针left, i, right使得对于数组nums的区间[START...END]满足:nums[START, left) < PIVOTnums[left, i) == PIVOTnums(right, RIGHT] >...原创 2020-04-10 23:51:48 · 278 阅读 · 0 评论 -
经典算法题 数据流的中位数 Java代码实现
题目链接:面试题41. 数据流的中位数基本思想:使用一个最小堆minHeap(Java PriorityQueue默认为最小堆)和一个最大堆maxHeap,在输入数字的过程中,保证maxHeap.peek() <= minHeap.peek()maxHeap.size()与minHeap.size()相差不超过1维护上面两个属性很简单,且看代码:class MedianFind...原创 2020-04-10 22:26:40 · 298 阅读 · 0 评论 -
开4N空间的自顶向下线段树(Top-down Segment Tree using 4N space)
线段树有很多种,但是最好理解、最好写的还是下面这种开4N空间的自顶向下线段树。public class SegmentTreeTopDown { private int[] tree; private int n; public SegmentTreeTopDown(int[] nums) { // in the worst case it occupy ...原创 2020-03-21 12:52:48 · 220 阅读 · 0 评论 -
LeetCode 310. Minimum Height Trees 解法
LeetCode 310. Minimum Height Trees 解法最简单的解法就是DFS遍历,即从每个节点出发,计算到达末端节点的最大路径长度,那么此路径长度最小的就是最矮树的根(可能有多个)。但是这个方法会超时,代码如下(Java):class Solution { public List<Integer> findMinHeightTrees(int n, in...原创 2020-03-02 20:44:10 · 265 阅读 · 0 评论 -
红黑树bottom-up插入删除简要总结
目录插入操作删除操作插入操作插入空树,done父节点为黑色,done父节点为红色,看叔节点:1. 叔节点为黑色时,通过单旋(zig-zig)或者双旋(zig-zag)变成一个4-node2. 叔节点为红色时,通过变色修正,最后祖父节点变为红色,若再出现双红,则递归解决(如果递归到根,则需要把根节点染黑)top-down的插入则是从上到下拆开4-node,避免3-2情况出现。删...原创 2019-09-11 10:58:34 · 360 阅读 · 0 评论 -
第k个排列的确定方法
这篇文章——————————————————————————————————例如,对于这样一些数:[1, 2, 3, 4, 5, 6, 7],如何确定它的第k个排列(按字典序)?假设k = 2 * 4! + 3 * 3! + 2,考虑下面的一些排列:形如[1, 2, 3, 4, 5, 6, *]的排列是最小的1!个排列;形如[1, 2, 3, 4, 5, *, *]的排列是最小的2!个排...原创 2019-08-24 17:15:19 · 722 阅读 · 0 评论 -
求数组最小的k个数
目录1. 利用partition函数的O(n)解法实现时间复杂度分析优缺点2. 利用最大堆的O(nlogk)解法实现时间复杂度分析优缺点写两种聪明的解法(更推荐第二种,原因见优缺点)。计数或者排序这些朴素的解法就不说了。1. 利用partition函数的O(n)解法实现定义partition函数,partition函数必须满足:传入一个数组和一个范围,返回一个index,在index左边...原创 2019-07-08 17:55:13 · 549 阅读 · 1 评论 -
分区相连的快速排序产生死循环的分析
分区相连的快速排序的正确实现和一种错误实现分区相连的快速排序指的是,Partition后的两个分区是相连的, 在这种分区方式中,partition后数组被分为左右两段,保证以下关系成立:partition[left...partitionIndex] <= partition[partitionIndex + 1, right]由于这两半分区是相连的,所以当左边或者右边的分区是空的时...原创 2019-07-08 13:19:14 · 878 阅读 · 0 评论 -
POJ 1922 Ride to School 解
这道题是小学级别的题目,不知道为什么https://web.stanford.edu/class/cs97si/assn1.html这里把它的难度标为5(和POJ1001这道有点麻烦的题难度相同),可能因为老外数学太差?题目http://poj.org/problem?id=1922答案using namespace std;int main(){ int n, v, t, ...原创 2019-07-02 11:38:33 · 190 阅读 · 0 评论 -
POJ 1001 Exponentiation 解
题目http://poj.org/problem?id=1001ExponentiationTime Limit: 500MS Memory Limit: 10000KTotal Submissions: 188015 Accepted: 45212DescriptionProblems involving the computation of exact values of ve...原创 2019-07-02 10:26:52 · 192 阅读 · 0 评论 -
快速排序注意事项&两种partition的方式
文章目录pivot的选取方式pivot选取禁忌partition的方式Lomuto SchemeHoare Scheme快速排序算法的正确性的必要条件pivot的选取方式取第一个元素或最后一个元素(最坏情况:数组已经排好序)取首个元素、中间元素、最后一个元素的中位数(三数取中,不是平均数!!)随机取一个元素pivot选取禁忌如果对连续的两个子区间排序,不能选择大于或小于所有数...原创 2019-05-11 21:24:02 · 936 阅读 · 0 评论 -
最长递增子序列(LIS)问题的O(NlogN)算法思路
文章目录O(NlogN)的动态规划解法优化:O(NlogN)的算法最优解法参考资料O(NlogN)的动态规划解法很容易就能想到,如果用 dpidp_idpi 代表以 iii 结尾的LIS长度,用 AiA_iAi 代表数组第 iii 项,可以写出以下式子:dp_i = max \ \{dp_j + 1\} \ for \ j < i \ and \ A_j<A_i最大的 ...原创 2019-05-05 12:11:23 · 1811 阅读 · 1 评论 -
二分查找的优雅写法 / 在排序数组中二分寻找一个数的出现次数/范围/第一次出现/最后一次出现
目录二分查找的优雅写法0 二分查找的分类1 求第一个大于等于查找值的位置2 求第一个大于查找值的位置3 求最后一个小于(等于)查找值的位置4 求某一个值的出现范围/次数5 示例二分查找的优雅写法根据返回值的要求不同,二分查找有以下几种(假定我们在一个整数数组中查找某个value)0 二分查找的分类有下面几种形式的要求:如果存在,返回true,否则返回false。如果存在,返回第一次...原创 2019-04-28 22:10:41 · 763 阅读 · 0 评论