![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
虎哥和你一起学编程
路漫漫其修远兮吾将上下而求索
展开
-
毒酒问题算法题
题目:有1000瓶酒,其中一瓶有毒,毒性一周以后会爆发,现在拿小白鼠来做实验,问最少需要多少只小白鼠,才能一周之后知道哪一瓶酒有毒?答案:10只,1000转化成二进制,最多10位,2^10 = 1024 > 1000,最后通过取交集的方式可以判断出哪一瓶酒有毒。原创 2023-12-26 15:18:37 · 462 阅读 · 0 评论 -
非递归方式实现的二叉树的遍历
中序遍历是 左--》中--》右的顺序,可以考虑先找到所有左节点,然后按照先进后出栈的结构来实现。先来一个简单的二叉树。 public class BinarySearchTree { Node root; public void add(Integer value){ if(root == null){ root = new Node(value); return; } ...原创 2022-01-18 18:59:58 · 185 阅读 · 0 评论 -
java实现简易版布隆过滤器
public class BloomFilters { /** * 数组长度 */ private int arraySize; /** * 数组 */ private int[] array; public BloomFilters(int arraySize){ this.arraySize = arraySize; this.array = new int[arraySize]; .原创 2021-12-17 20:35:00 · 697 阅读 · 0 评论 -
红黑树的插入自平衡
public class RBTree<T extends Comparable<T>>{ private RBTNode<T> mRoot; //根节点 private static final boolean RED = false; private static final boolean BLACK = true; public class RBTNode<T extends Comparable<T>&g.原创 2021-11-22 10:41:41 · 199 阅读 · 0 评论 -
接雨水问题
给定n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例 1:输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。示例 2:输入:height = [4,2,0,3,2,5]输出:9来源:力扣(LeetCode)链接:https://leetcode-c...原创 2021-11-21 18:28:22 · 79 阅读 · 0 评论 -
红黑树的五大特性
红黑树是一种非完全平衡二叉树,由于其在自平衡与查找之间的一个平衡,使得其在插入和查找时的性能都很好,经常在很多地方都会使用到,具有以下五大特性 1.节点要么为黑色要么为红色 2.根节点为黑色 3.叶子节点(Nil空节点)为黑色 4.红色节点的孩子都为黑色节点 5.任一节点到叶子节点的黑色节点的数量一致。...原创 2021-11-20 10:58:08 · 7058 阅读 · 0 评论 -
最长和谐子序列
和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。示例 1:输入:nums = [1,3,2,2,5,2,3,7]输出:5解释:最长的和谐子序列是 [3,2,2,2,3]示例 2:输入:nums = [1,2,3,4]输出:2示例 3:输入:nums = [1,原创 2021-11-20 10:20:18 · 90 阅读 · 0 评论 -
拆炸弹算法
你有一个炸弹需要拆除,时间紧迫!你的情报员会给你一个长度为n的循环数组code以及一个密钥k。为了获得正确的密码,你需要替换掉每一个数字。所有数字会同时被替换。如果k > 0,将第i个数字用 接下来k个数字之和替换。如果k < 0,将第i个数字用 之前k个数字之和替换。如果k == 0,将第i个数字用0替换。由于code是循环的,code[n-1]下一个元素是code[0],且code[0]前一个元素是cod...原创 2021-11-19 10:22:20 · 748 阅读 · 0 评论 -
LFU算法实现
LRU为最近最少使用,LFU为最不经常使用,它们的区别如下 例如1 ->2 -> 1 -> 2 -> 3 -> 4,缓存的容量为3 如果按照LRU,则会淘汰1,因为1访问的事件最远 按照LFU,则3,4访问次数最少,都为1次,4比3访问事件更近,则淘汰3. class LFUCache { Integer capacity; Integer minFrequency; Map<Int...原创 2021-11-18 23:23:48 · 1216 阅读 · 0 评论 -
判断单链表是否有环
1.遍历每一个节点,然后加入一个set中,如果set中包含某一个节点,则有环2.快慢指针 其中一个每次走一步,另一个每次走两步,如果最后相遇,则有环。public static void main(String[] args) { Node head = new Node(1); Node node1 = new Node(2); Node node2 = new Node(3); Node node3 = new Node(..原创 2021-11-18 17:26:22 · 307 阅读 · 0 评论 -
使用递归的方式实现单链表反转
public static void main(String[] args) { Node head = new Node(1); Node node1 = new Node(2); Node node2 = new Node(3); Node node3 = new Node(4); Node node4 = new Node(5); head.next = node1; node1.next.原创 2021-11-17 22:29:10 · 445 阅读 · 0 评论 -
最长不重复子串
最长不重复子串是一个常见的算法题,一般采用滑动窗口的解决办法。通过两个移动的下标来解决。 public static String maxNoRepeatSubstring(String s){ Set<Character> set = new HashSet<>(); int maxLen = 0; int start = 0; int i = 0, j = 1; set.add...原创 2021-11-16 09:48:43 · 70 阅读 · 0 评论 -
查找和为偶数的两个最相邻的质数
任何一个偶数(大于2)都是两个质数的和,例如10 = 5 + 5, 8 = 5+ 3,要求这两个质数的差最小,即最相邻。 public static int[] minPriDelta(int num){ int[] arr = new int[2]; int middle = num/2; for (int k = middle; k >= 1; k --){ boolean flag =...原创 2021-10-22 08:55:36 · 110 阅读 · 0 评论 -
leetcode正则表达式匹配
正则表达式匹配给你一个字符串s和一个字符规律p,请你来实现一个支持'.'和'*'的正则表达式匹配。'.'匹配任意单个字符 '*'匹配零个或多个前面的那一个元素所谓匹配,是要涵盖整个字符串s的,而不是部分字符串。public static boolean isMatch(String s, String p) { int m = s.length(); int n = p.length(); boolean[][...原创 2021-09-22 19:03:02 · 120 阅读 · 0 评论 -
分割链表算法
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。需要保证分割链表的稳定性。public static ListNode partition(ListNode head, int x) { ListNode dummy = new ListNode(-1); dummy.next = head; ListNode cursor = dummy; Li原创 2021-08-02 15:06:06 · 100 阅读 · 0 评论 -
斐波拉契数列(动态规划)
基于动态规划来解决斐波拉契数列,替代递归的方式求解。个人觉的递归最大的问题就是会有许多的重复计算,但是动态规划通过将中间过程数据保存下来,大大节省了重复计算的量。 public class TestFiblaqie { public static void main(String[] args) { System.out.println(fibArray(5)); } public static int fibArray(i...原创 2021-07-23 10:45:30 · 106 阅读 · 0 评论 -
数组不相邻元素最大和的解法(动态规划)
给定数组,要求不相邻元素组成的子数组的和最大. public class Test { public static void main(String[] args) { int[] arr = {1, 3, 5, 2, 7, 9, 4, 8, 6}; System.out.println(maxNoNeighborhoodSum(arr)); } public static int maxNoNeighborho...原创 2021-07-23 10:38:47 · 1258 阅读 · 0 评论 -
单链表反转及取中间值
定义一个单链表public class ListNode { public Integer value; public ListNode next; public ListNode(Integer value) { this.value = value; }}原创 2021-06-08 22:25:19 · 103 阅读 · 0 评论 -
青蛙跳台阶问题
假设一只青蛙每次可以跳1步或2步,台阶总共有n步,总共有多少种跳法? public class StepAlgorithm { public static void main(String[] args) { System.out.println(getAllSteps(5)); } public static int getAllSteps(int n){ if(n == 1){ ret...原创 2021-05-21 09:58:53 · 49 阅读 · 0 评论 -
多项式的链表表示及相加
多项式可以使用数组或链表来表示,例如如下多项式 3X^2 + 5 使用数组可以这样来表示[2, 3, 2, 5, 0] 其中第一项表示非零项的项的个数,后面3代表系数,2表示指数。 或者 [2, 3, 0, 5] 其中2表示指数的最高次幂,其余表示对应的0-->n次幂的系数。 由于数组是静态结构,即提前已经分配好内存,并且在插入或者删除时时间...原创 2020-12-09 11:20:07 · 964 阅读 · 0 评论 -
单链表的反转java实现
单链表里面的节点知道下一个节点是谁,但是无法知道上一个节点是谁,所以有的时候会需要将单链表反转过来。下面是单链表反转的java实现. public class LinkedList { /** * 头节点 */ private Node head; /** * 尾节点 */ private Node tail; /** * 链表是否为空 */...原创 2020-12-08 14:59:07 · 269 阅读 · 0 评论 -
时间复杂度的表示方式
时间复杂度有五种表达方式,还有一种非正式的OO表达方式,就是常数级非常大的时候,例如10的80次方 Big Oh O --->渐进上界(最坏时间复杂度) f(n) <= O(n) small Oh o ----> f(n) < o(n) Big Omega Ω ---> 渐进下界(最好时间...原创 2020-12-02 17:25:09 · 2392 阅读 · 0 评论 -
二叉树的前序遍历 中序遍历 后序遍历
树的遍历一般是从左至右,按照根结点在前中后的顺序分为了前序遍历,中序遍历和后序遍历 前序遍历: 根结点 --》左节点--》右节点 中序遍历: 左节点--》根结点--》右节点 后序遍历: 左节点--》右节点--》根节点 下面写了一个遍历的demo public class BinaryTree { private Node root; public boolean ...原创 2020-12-02 10:41:21 · 107 阅读 · 0 评论 -
Trie树java实现
Trie树又称前缀树或称字典树,是一个多叉树。可以实现前缀匹配查询或者字符串匹配查询。以下是java实现版 import java.util.TreeMap;/** * @Description Trie树(字典树/前缀树) * @Author steve * @Date */public class TrieTree { /** * 根节点 */ private Node root; ...原创 2020-11-28 18:35:34 · 419 阅读 · 0 评论 -
Rabin Karp字符串匹配算法
Rabin Karp算法是Brute Force算法的升级版,通过计算主串中的n-m+1个子串的hash值,然后与模式串的hash值直接进行比较,避免了主串的子串与模式串的逐一比较,最好情况可以达到O(m +n)的时间复杂度.m为模式串的长度,n为主串的长度。关键就在设计hash函数上,通过rolling hash(滚动hash)来降低时间复杂度. 下面是java实现版 /** * rabin Karp字符串匹配算法 * @param...原创 2020-11-17 16:07:17 · 495 阅读 · 0 评论 -
Brute Force(暴力破解/朴素匹配算法)
在字符串的匹配时,单模式串的匹配,最有效或者最简单的就是暴力破解. public class BF { public static void main(String[] args) { System.out.println(bfMatch("dsjfkdfdjk", "jf")); } /** * * @param text 主串 * @param pattern 模式串 ...原创 2020-11-16 18:32:59 · 362 阅读 · 0 评论 -
快速排序java实现版
快速排序正如名字一样,因为有着O(NLogN)的时间复杂度,效率很快,在很多时候备受青睐,里面使用了递归,分治的思想。下面就来演示一下java如何实现快速排序。 public class QuickSort { public static void main(String[] args) { int[] arr = {5,2,4,8,1,9,3,15}; quickSort(arr, 0, arr.length - ...原创 2020-10-26 20:33:56 · 2431 阅读 · 2 评论 -
美团算法面试题
今天面试了美团的java,碰到了一道面试题要求将阿拉伯数字转成罗马数字,在此记录一下 public static String aToR(int num){ String rString=""; int[] nArr={1000,900,500,400,100,90,50,40,10,9,5,4,1}; Stri...原创 2020-03-04 19:45:14 · 1889 阅读 · 0 评论 -
如何将两个有序的数组合并成一个有序的数组
今天面试的时候碰到了一个面试题,在这里记录一下 题目如下: 给定两个有序数组 int[] a={1,2,3,4} 和int[] b={5,6,7,8},写出一个能将两个有序数组合并成一个大的有序数组的实现: int[] a={1,2,3,8}; int[] ...原创 2020-03-02 18:33:49 · 4052 阅读 · 0 评论