算法
ReycoChou
这个作者很懒,什么都没留下…
展开
-
死磕算法-递归行为的实质
概述递归用一句话概括,就是自己调用自己,而实现就是通过系统栈对函数的出栈和压栈操作。用一个例子解释下递归的背后的实现 public static int getMax(int[] arr,int left,int right) { if(left==right) { return arr[left]; } int mid = (left+right)/2; int m...原创 2019-02-21 17:23:45 · 232 阅读 · 0 评论 -
死磕算法-递归和动态规划
暴力递归把问题转化为规模缩小了的同类问题的子问题有明确的不需要继续进行递归的条件(base case)有当得到了子问题的结果之后的决策过程不记录每一个子问题的解那么,怎么最终确定它能不能用“递归”做呢?看当N取1或2之类最简情况时,问题是否可以解决——然后写程序解决它动态规划从暴力递归中来将每一个子问题的解记录下来,避免重复计算把暴力递归的过程,抽象成了状态表达并且存在...原创 2019-04-15 11:56:51 · 172 阅读 · 0 评论 -
贪心策略
拼接最小字典序给定一个字符串类型的数组strs,找到一种拼接方式,使得把所有字符串拼起来之后形成的字符串具有最低的字典序。此题很多人的想法是把数组按照字典序排序,然后从头到尾连接,形成的字符串就是所有拼接结果中字典序最小的那个。但这很容易证明是错的,比如[ba,b]的排序结果是[b,ba],拼接结果是bba,但bab的字典序更小。 正确的策略是,将有序字符串数组从头到尾两两拼接时,应取两两拼...原创 2019-04-14 16:10:55 · 335 阅读 · 0 评论 -
死磕算法-前缀树
什么是Trie树?Trie树,又叫字典树,单词查找树或键树,是一种多叉树结构。上图是一棵Trie树,表示了关键字集合{“a”, “to”, “tea”, “ted”, “ten”, “i”, “in”, “inn”} 。从上图可以归纳出Trie树的基本性质:根节点不包含字符,除根节点外的每一个子节点都包含一个字符从根节点到某一个节点,路径上经过的字符连接起来,为该节点对应的字符串每个...原创 2019-04-13 23:44:19 · 172 阅读 · 0 评论 -
死磕算法-布隆过滤器
生动形象地介绍了布隆过滤器来自知乎的介绍原创 2019-04-13 19:57:30 · 95 阅读 · 0 评论 -
死磕算法-设计RandomPool结构
设计RandomPool结构题目:设计一种结构,在该结构中有如下三个功能: insert(key):将某个key加入到该结构,做到不重复加入。 delete(key):将原本在结构中的某个key移除。 getRandom(): 等概率随机返回结构中的任何一个key要求: Insert、delete和getRandom方法的时间复杂度都是 O(1)import java.util.HashMa...原创 2019-04-13 16:21:01 · 130 阅读 · 0 评论 -
死磕算法-树相关
在二叉树中找到一个节点的后继节点题目:现在有一种新的二叉树节点类型如下public static class Node { public int value; public Node left; public Node right; public Node parent; public Node(int data) { this.value = data; }...原创 2019-04-13 14:31:08 · 149 阅读 · 0 评论 -
死磕算法-二叉树的遍历
二叉树实现public static class Node { public int value; public Node left; public Node right; public Node(int data) { this.value = data; } }二叉树中的访问,访问其实是根据实际的需要来确定要做什么,比如对每个结点进行相关计算,输出打印等二...原创 2019-04-13 00:46:09 · 136 阅读 · 0 评论 -
死磕算法-链表相关
反转单向链表反转利用栈反转单向链表通过栈的先进后出,反转单向链表 public class Node{ public int value; public Node next; public Node(int data){ this.value=data; } } public No...原创 2019-04-11 23:12:15 · 100 阅读 · 0 评论 -
死磕算法-打印矩阵
转圈打印矩阵转圈打印矩阵的基本思路就是获取矩形边框,并打印边框public static void spiralOrderPrint(int[][] matrix) { //左边界的纵坐标 int tR = 0; //左边界的横坐标 int tC = 0; //右边界的纵坐标 int dR = matrix.length - 1; //有边界的横坐标 int ...原创 2019-04-11 22:10:15 · 212 阅读 · 0 评论 -
死磕算法-数组栈和队列
数组实现固定大小的栈public class Array2Stack<T> { private T[] arr; //size就是添加元素要存放的位置 private Integer size; public Array2Stack(int initSize) { if(initSize < 0) { throw new IllegalArgument...原创 2019-04-11 20:43:09 · 117 阅读 · 0 评论 -
死磕算法-堆
什么是堆?堆又称为优先队列,但堆并不是队列优先队列:一种特殊的队列,队列中元素出栈的顺序是按照元素的优先权大小的,而不是元素入队的先后顺序。堆的特性必须是完全二叉树用数组实现任一节点的值是其子树所有结点的最大值或最小值最大值时,称为"最大堆",也称大根堆最小值时,称为"最小堆",也称小根堆大根堆小根堆对于堆这种数据结构,从根节点到任意结点路径上所有的结点都是有...原创 2019-04-11 12:01:42 · 257 阅读 · 0 评论 -
死磕算法-荷兰国旗问题
问题引入荷兰国旗问题引入代码public class NetherlandsFlag { //交换顺序 public static int[] partition(int[] arr,int l ,int r,int p) { //左边区域是数组索引-1 int less = l - 1; //右边区域是数组索引+1 int more = r + 1; while...原创 2019-04-10 20:36:54 · 80 阅读 · 0 评论 -
死磕算法-排序
冒泡排序冒泡排序的基本思想是对相领的元素进行两两比较,顺序相反则进行交换,这样一趟下来就能将最小或最大的元素浮到&amp;amp;amp;quot;顶端&amp;amp;amp;quot;,然后将待排序列分为两部分,一部分为有序序列,另一部分是无序序列,只对无序序列中元素进行两两比较。(关键字就是相邻两两比较)public static void BubbleSort(int[] arr) { if(arr==null || arr.length&a原创 2019-04-11 12:04:59 · 221 阅读 · 0 评论 -
死磕算法-归并排序解决小和问题
情景引入我们可以用遍历的方式解决小和问题,但是时间复杂度为O(N2)归并排序解决小和归并就是"分治",将无序数组不断细分,然后从最小单元(无法再细分)开始归并。可以简单的理解为,就是将数组中很多元素的复杂问题拆分成两个数之间的问题。求小和的原理这里主要就是利用合并的过程中,两个有序组都是有序的进行判断累加,我们通过一个例子来解释下。(ps:两个有序数组合并成一个有序数组的方法叫快排)...原创 2019-02-21 18:04:45 · 259 阅读 · 0 评论 -
最优算法下界
题目解析选择问题的复杂度下界:找最大问题的下界是:n-1找第二大问题的下界是:n+logn-2原创 2019-05-06 23:31:28 · 732 阅读 · 0 评论