java基本算法与代码片段
西木风落
多年开发经验,专业、高效,致力于更好的自己
展开
-
字典树
一、字典树Trie树,即字典树,又称单词查找树或键树,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。它有3个基本性质:1)根节点不包含字符,除根节点外每一个节...原创 2020-03-09 18:43:14 · 334 阅读 · 0 评论 -
求数组中位数
求无序数组第K大元素的算法,有两种思路:方法1:暴力法,通过最数组元素排序,找到第K大元素。方法2:利用快排的思想,对整个数组元素分组。任意挑一个元素,以该元素key,划分数组为两部分,key左边元素小于等于key,右边元素大于等于key。在分组完的组中,如果左侧的元素个数小于k-1,则在右侧的子序列中查找;如果左侧的元素个数等于k-1,则第K大的元素就是分割点;如果左侧的元素个数大于...原创 2020-02-17 20:20:44 · 3375 阅读 · 0 评论 -
翻转单链表
public ListNode reverse(ListNode head){ if(head == null || head.next == null){ return head; } ListNode pre = null; ListNode cur = head; while(cur != null){ ListNo...原创 2020-02-16 13:18:38 · 146 阅读 · 0 评论 -
合并K个排序链表
有K个排序好的链表,现在对这些链表合并成一个排序好的链表。解题思路:1、暴力法,选取节点的时候,对K个链表都进行比较,时间复杂度O(K*n)2、利用堆排序思想,时间复杂度O(n*lg(k))public Node mergeK(ListNode[] list){ if(list == null || list.length == 0){ return null...原创 2020-02-16 12:19:14 · 184 阅读 · 0 评论 -
LRU缓存实现
本章主要介绍通过Java自带的LinkedHashMap做LRU以及自实现LRU。public class LRUCache extends LinkedHashMap{ private int capacity; @Override protected boolean removeEldestEntry(java.util.Map.Entry<K, V>...原创 2020-01-16 00:10:49 · 218 阅读 · 0 评论 -
判断一棵树是平衡二叉树
怎么判断一棵树是平衡二叉树呢?实现方式:public boolean balanceTree(Node root, long min, long max){ if(root == null) return true; return root.val>min && root.val<max && balanceTree(root....原创 2020-01-15 22:45:51 · 182 阅读 · 0 评论 -
二叉树相关的创建或者遍历
一、通过先根遍历和中根遍历数组,构建还原二叉树思想:先根遍历数组,第一个元素就会是二叉树的根,然后找到根在中根遍历的位置,则中根遍历左边的就是左孩子,右边的就是右孩子。利用递归思想。public Node create(int[] pre, int[] in, int preStart, int preEnd, int inStart, int inEnd){ Node root...原创 2020-01-11 17:44:01 · 210 阅读 · 0 评论 -
Avl红黑树的构建和节点操作
红黑树定义和性质:红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须满足下面性质:性质1:每个节点要么是黑色,要么是红色。 性质2:根节点是黑色。 性质3:每个叶子节点(NIL)是黑色。 性质4:每个红色结点的两个子结点一定都是黑色。 性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。当插入和删除节点后,需要重新平衡AVL树,具体的演示如图:第一张图是对左孩子...原创 2020-01-09 17:33:42 · 140 阅读 · 0 评论 -
KMP 算法实现
求一个字符串中是否包含另一个字符串;最直接的办法就是通过朴素匹配法,其时间复杂度为O(n*m)public int indexOf(String source, String pattern) { int i = 0, j = 0; int sLen = source.length(), pLen = pattern.length(); char[] src =...原创 2019-11-11 23:42:41 · 151 阅读 · 0 评论 -
给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数
本题是编程珠玑上的一道算法题,下面先介绍思想,然后做算法实现。int 类型的32位整数,存在的数字个数有2的32次幂,大于40亿,越有43亿多。因为这些整数从0x0000 0000 到0xffff ffff,均匀分布,所以如果全部包括2^32个数,则可以看到0和1的个数是相等的,即各自为50%的出现概率。假设32位整数A和32位整数B在第i个二进制位处分别是0和1,则认为A和B是i位互补数。归...原创 2019-11-10 23:33:25 · 521 阅读 · 0 评论 -
深度优先和广度优先遍历
对于图的邻接矩阵,多深度遍历和广度遍历public class DFSTest { static int size = 4; static boolean[] visited = new boolean[size]; static int [][] map = new int[size][size]; public static void main(...原创 2019-11-10 21:41:39 · 161 阅读 · 0 评论 -
打印字符的所有排列组合
给定一个字符串,输出字符串中字符的所有排列组合 public static void permutation(char[] str, int i) { if (i >= str.length) return; if (i == str.length - 1) { System.out.println(Str...原创 2019-11-07 23:22:41 · 1018 阅读 · 0 评论 -
背包问题——Java算法求解
背包问题描述:背包的容量为V,现在有N类物品,第i类物品的重量是weight[i],价值是value[i],那么往该背包里装东西,怎样装才能使得最终包内物品的总价值最大。这里装物品主要由三种装法:1、0-1背包:每类物品最多只能装一次2、多重背包:每类物品都有个数限制,第i类物品最多可以装num[i]次3、完全背包:每类物品可以无限次装进包内采用动态规划方法求解:用dp[N]...原创 2019-10-27 23:16:17 · 271 阅读 · 0 评论 -
Rotate ListNode In K Groups
K个节点一组,反转链表;private Node reverse(Node pre, Node next){ Node last = pre.next; Node cur = last.next; while(cur != next){ last.next = cur.next; cur.next = pre.next; ...原创 2017-12-12 11:10:47 · 241 阅读 · 0 评论 -
二叉树的遍历
二叉树的基本遍历,包括前序、中序和后序,实现方式有递归和非递归;public static void preOrder(TreeNode root){ if(root != null){ visit(root); preOrder(root.left); preOrder(root.right);原创 2017-12-13 14:48:18 · 183 阅读 · 0 评论 -
HashMap的简单实现
依据hashmap的原理,自己实现了一个简易版: public class MyHashMap<K, V> { private int capacity; private double loadFactor = 0.8; private Entry[] table= null; private int size; public...原创 2017-10-19 17:26:03 · 313 阅读 · 0 评论 -
利用Condition实现生产者和消费者资源共享
Condition的特性: 1.Condition中的await()方法相当于Object的wait()方法,Condition中的signal()方法相当于Object的notify()方法,Condition中的signalAll()相当于Object的notifyAll()方法。不同的是,Object中的这些方法是和同步锁捆绑使用的,而Condition是需要与互斥锁/共享锁捆绑...原创 2017-02-17 18:10:15 · 409 阅读 · 0 评论 -
java实现DES加密
通常,在传输文件的时候,需要对传输内容进行加密。DES是一种比较简单的加密方式,能够满足一定条件下的数据安全需求。 public class DESTest { static String DES = "DES"; public static void main(String[] args){ String strData = "woshihaoren"; Strin...原创 2017-03-23 19:50:02 · 375 阅读 · 0 评论 -
一致性Hash算法
一、什么是一致性hash算法 构造一个长度为为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(分布为[0, 232-1])将缓存服务器节点放置在这个Hash环上,对所需要缓存数据的key做hash运算,其值也分布在[0, 232-1]上,在Hash环上顺时针查找距离这个Key值的Hash值最近的服务器节点,完成Key到服务器的映射查找。二、一致性Hash算...原创 2017-05-14 22:50:54 · 666 阅读 · 0 评论 -
大顶堆排序
堆排序的思想借助了二叉排序树,时间复杂度:O(NlgN),空间复杂度O(N)。首先需要构建堆,堆分为大顶堆和小顶堆,如果是大顶堆,任意一个元素,满足arr[i] >=arr[2*i +1] && arr[i] >=arr[2*i+2];小顶堆满足arr[i] <=arr[2*i+1] && arr[i] <= arr[2*i+2];堆...原创 2017-12-12 10:46:46 · 789 阅读 · 0 评论