算法
算法
GaleZhang
这个作者很懒,什么都没留下…
展开
-
几种常用排序算法的最佳实践,记录下备用
class Sort { public void quickSort(int[] arr, int st, int end) { if(st >= end) { return; } int l = st; int r = end; int cur = arr[st]; while(l < r) { while(l < r &&am原创 2020-09-25 14:10:12 · 124 阅读 · 0 评论 -
LeetCode1494 并行课程II——状态压缩DP
前言原创 2020-09-14 17:46:33 · 305 阅读 · 0 评论 -
LeetCode1483 树节点的第K个祖先——构造缓存,查询优化到O(logN)
题目LeetCode1483 树节点的第K个祖先给你一棵树,树上有 n 个节点,按从 0 到 n-1 编号。树以父节点数组的形式给出,其中 parent[i] 是节点 i 的父节点。树的根节点是编号为 0 的节点。请你设计并实现 getKthAncestor(int node, int k) 函数,函数返回节点 node 的第 k 个祖先节点。如果不存在这样的祖先节点,返回 -1 。树节点的第 k 个祖先节点是从该节点到根节点路径上的第 k 个节点。提示:1 <= k <= n &原创 2020-09-11 11:54:33 · 283 阅读 · 0 评论 -
整理一下各种背包问题:01背包,完全背包,填满背包,带负数的背包
前言发现自己不知第几次搜背包问题的相关知识点了,决定自己整理一下,好记性不如烂笔头。01背包问题:有n件物品,第i件物品的价值是v[i],重量是w[i],背包的容量是c,问能装下的最大价值是多少?我们令dp[i][j]表示前i件物品放到容量为j的背包中的最大价值,则可以对第i件物品分情况讨论,若不放第i件物品,则dp[i][j]等于dp[i-1][j],若放第i件物品,首先要满足j大于w[i],此时的dp[i][j]等于dp[i-1][j-w[i]]+v[i],取两者中的较大值即可。代码publ原创 2020-09-07 17:58:08 · 1354 阅读 · 0 评论 -
二项式定理在算法中的应用
前言数学中的一些公式在计算机科学中非常有用,尤其是在ACM中,几乎全是概率论与数理统计。今天说一下常用的一个公式:二项式定理。二项式定理的最基本形式是:(a+b)n=Cn0anb0+Cn1an−1b1+Cn2an−2b2+...+Cnna0bn(a + b)^n = C_n^0a^nb^0+C_n^1a^{n-1}b^1+C_n^2a^{n-2}b^2+...+C_n^na^0b^n(a+b)n=Cn0anb0+Cn1an−1b1+Cn2an−2b2+...+Cnna0bn由此可以得到两个重要原创 2020-09-03 18:58:29 · 857 阅读 · 0 评论 -
LeetCode1531:DP的常见思路——分情况讨论
前言在使用动态规划解决问题时,最关键的一步就是列出状态转移方程,完善代码一般就是水磨工夫了。但是状态转移方程并不好列,我们需要将问题拆分成子问题,并找到如何用子问题的解递推我们当前问题的解。要找到状态转移方程,首先我们要找到一种最合适的方法去表示状态,或者说中间结果,然后找到这样表示状态时状态间是如何递推的。这两步都很关键。简单的DP问题其状态转移方程往往是很容易看出的,当前的结果一般是之前结果的加减乘除或者逻辑运算。而复杂一些的DP问题就会转几个弯,一般是无法直接从中间结果得到,需要根据具体的问题做原创 2020-09-02 16:37:18 · 591 阅读 · 0 评论 -
记录一道有意思的题目:ArrayList的add(int index, E e)时间复杂度小于O(n)吗?
LeetCode 5497查找大小为m的最新分组给你一个数组 arr ,该数组表示一个从 1 到 n 的数字排列。有一个长度为 n 的二进制字符串,该字符串上的所有位最初都设置为 0 。在从 1 到 n 的每个步骤 i 中(假设二进制字符串和 arr 都是从 1 开始索引的情况下),二进制字符串上位于位置 arr[i] 的位将会设为 1 。给你一个整数 m ,请你找出二进制字符串上存在长度为 m 的一组 1 的最后步骤。一组 1 是一个连续的、由 1 组成的子串,且左右两边不再有可以延伸的 1原创 2020-08-23 15:12:27 · 413 阅读 · 0 评论 -
桶排序
桶排序问题:给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。如果数组元素个数小于 2,则返回 0。示例 1:输入: [3,6,9,1]输出: 3解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。示例 2:输入: [10]输出: 0解释: 数组元素个数小于 2,因此返回 0。说明:你可以假设数...原创 2020-01-02 16:07:32 · 230 阅读 · 0 评论 -
深度优先搜索DFS
深度优先搜索DFS它的思想是从一个顶点开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念。深度优先搜索一般通过栈来实现。二叉树的先序遍历:LeetCode144class Solution { public List<Integer> preorderTraversal(TreeN...原创 2019-12-17 19:01:23 · 144 阅读 · 0 评论 -
广度优先搜索BFS
广度优先搜索BFS特点解决两类问题:从A出发是否存在路径到达B点;从A出发到达B点的最短路径不考虑结果的可能位置,彻底的搜索整张图,直到找到结果为止通过队列(queue)来实现最简单的应用:二叉树的层次遍历LeetCode102:给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。class Solution { public List<...原创 2019-12-17 18:19:24 · 126 阅读 · 0 评论 -
整理一下最常用的三种排序:快速排序,归并排序,堆排序
整理一下最常用的三种排序给出一个区间的集合,请合并所有重叠的区间。快速排序归并排序堆排序以LeetCode56题为例,原理就不多说了给出一个区间的集合,请合并所有重叠的区间。示例 1:输入: [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2...原创 2019-12-16 13:21:09 · 862 阅读 · 0 评论