
数据结构和算法
数据结构和算法
G0o0o0o
这个作者很懒,什么都没留下…
展开
-
布隆过滤器
搞一搞布隆过滤器1. 布隆过滤器顾名思义,它是一个过滤器,发明它的人叫布隆,1970年提出的。布隆过滤器实际上是一个数据结构,是一个很长的二进制向量和一系列随机映射函数,它是用来检索一个元素是否在这个集合中的。在如今数据量巨大的情况下,布隆过滤器具有很好的空间效率和时间效率,一般布隆过滤器只有两个功能,insert和isExist。2. 介绍当插入数据时不会关心他的索引值,也就是不...原创 2020-03-03 10:11:16 · 251 阅读 · 0 评论 -
Hash设计——设计RandomPool结构
【题目】设计一种数据结构void insert(key): 将key加入到该结构,并且不能重复插入;void delete(key): 将原本在数据结构中的key移除;key getRandom(): 等概率返回数据结构中的一个key;【要求】insert,delete和getRandom方法的复杂度都是O(1);【代码如下】import java.util.HashMap;pu...原创 2019-09-29 11:42:30 · 151 阅读 · 0 评论 -
并查集
import java.util.HashMap;import java.util.List;import java.util.Stack;public class Code04_UnionFind { public static class Element<V> { public V value; public Element(V value) { thi...原创 2019-11-18 22:48:16 · 143 阅读 · 0 评论 -
KMP算法
KMP算法KMP就是一个查看一个字符串是否是另一个字符串的子串的算法。什么是PMTKMP的核心是它的部分匹配表的数组(PMT)。解释一下:举个例子,字符串abcab,前缀集合{ a , ab , abc , abca } ,后缀集合{ b , ab , cab , bcab}。所以这两个集合的交集是ab,长度也就是2。同理abcabc也是一样的。PMT的使用那么KMP如何使用PMT的呢?的空间复杂度,morris遍历可以将非递归遍历中的空间复杂度降为O(1)。从而实现时间复杂度为O(N),而空间复杂度为O(1)的精妙算法。morris遍历利用的是树的叶节点左右孩子为空(树的大量空闲指针),实现空间开销的极限缩减。基础逻辑/** * 树节点类 */ public static class Node{ public int value ; p原创 2020-07-30 17:14:06 · 203 阅读 · 0 评论 -
前缀树
前缀树定义:什么是前缀树 又称单词查找树,[Trie树](https://baike.baidu.com/item/Trie树),是一种[树形结构](https://baike.baidu.com/item/树形结构/9663807),是一种哈希树的变种。典型应用是用于统计,排序和保存大量的[字符](https://baike.baidu.com/item/字符)串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符原创 2020-08-26 20:03:57 · 216 阅读 · 0 评论 -
Java实现八种排序算法
八种排序算法package basicalgorithm.sort;import java.util.ArrayList;import java.util.Collections;import java.util.List;/** * @author gyh * @csdn https://blog.youkuaiyun.com/qq_40788718 * @date 2020/8/8 23:04 */public class SortUtil { /** * 桶排序原创 2020-08-09 20:51:53 · 162 阅读 · 0 评论 -
LeetCode338 比特位计数
//思路是找规律,动态规划的思想 //0 1 //10 11 //100 101 110 111 //bit[i] = bit[i-2^n] + 1 //2^(n+1) > i > 2^n public int[] countBits(int num) { int[] bit = new int[num+1]; if (num == 0){ return bit; } //循环的次数 .原创 2021-03-03 21:23:40 · 212 阅读 · 1 评论 -
LeetCode 滑动窗口题型练习(持续更新)
LeetCode 滑动窗口题型练习字符串的排列题目给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。换句话说,第一个字符串的排列之一是第二个字符串的子串。示例1:输入: s1 = “ab” s2 = “eidbaooo”输出: True解释: s2 包含 s1 的排列之一 (“ba”).示例2:输入: s1= “ab” s2 = “eidboaoo”输出: False注意:输入的字符串只包含小写字母两个字符串的长度都在 [1, 10,000] 之间原创 2020-08-01 21:14:27 · 1031 阅读 · 0 评论 -
LRU Cache 三步优化方案
LRU Cache首先说明这是携程2019年后端的笔试题https://www.nowcoder.com/question/next?pid=16620108&qid=365880&tid=35966796时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 64M,其他语言128M复制代码 ``设计一个数据结构,实现LRU Cache的功能(Least Recently Used – 最近最少使用缓存)。它支持如下``2``个操作: get 和 put。` `int`原创 2020-08-15 00:02:22 · 918 阅读 · 0 评论 -
树形DP
树形DP举例二叉树节点间最大距离一个二叉树中,任意两个结点的最大距离。自己的解法 public static class TreeNode { public int val ; public TreeNode left = null; public TreeNode right = null; public TreeNode(int val) { this.val = val; }原创 2020-07-31 21:26:32 · 229 阅读 · 0 评论 -
一个存储柜n层,夫人想拿出m件物品给别人但是又不想挑贵的送,所以决定每次从某一层的两侧随机挑选,问所能选择最贵的权值
一个存储柜n层,夫人想拿出m件物品给别人但是又不想挑贵的送,所以决定每次从某一层的两侧随机挑选,问所能选择最贵的权值测试了几组样例,感觉是对的,但是没有地方检验,慎重选择import java.util.ArrayList;import java.util.List;import java.util.Scanner;/** * @author gyh * @csdn https://blog.youkuaiyun.com/qq_40788718 * @date 2020/7/27 21:13 *.原创 2020-07-27 23:49:04 · 178 阅读 · 0 评论 -
机器人的运动范围和岛问题
机器人的运动范围和岛问题剑指Offer上面的 机器人的运动范围 和 岛问题 有着相似的解题思路。都可以通过矩阵的深度优先查询来解决这两个问题。机器人的运动范围题目地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35,原创 2020-07-26 00:06:14 · 145 阅读 · 0 评论 -
滑动窗口问题——生成最大窗口数组
滑动窗口问题——生成最大窗口数组情景有一个整型数组 arr 和一个大小为 w 的窗口从数组的最左边滑倒最右边,窗口每次向右边划一个位置。例如:数组为 [4,3,5,4,3,3,6,7],窗口大小为3时:[4 3 5] 4 3 3 6 7 窗口的最大值为54[3 5 4] 3 3 6 7 窗口的最大值为54 3[5 4 3] 3 6 7 窗口的最大值为54 3 5[4 3 3] 6 7 窗口的最大值为44 3 5 4[3 3 6]7 窗口的最大值为64 3 5 4 3[3 6 7] 窗口原创 2020-07-25 16:43:16 · 466 阅读 · 0 评论 -
Manacher算法——最长回文子串
Manacher——最长回文子串1. Manacher是干什么的?Manacher算法是一个用来查找一个字符串中的最长回文子串(不是最长回文序列)的线性算法。它的优点就是把时间复杂度为O(n^2)的暴力算法优化到了O(n)。2. 原始方法在没有学会Manacher算法之前,查找最长回文子串的方法就是纯暴力的匹配。根据每一个当前字符,向左右扩展。先不去判断对与错,单从这种算法上来讲,就已经是O(n^2)。其次,如果是偶回文就不是那么好判断了,比如abba,不能过滤出回文子串。3. Man原创 2020-07-24 15:57:03 · 384 阅读 · 0 评论 -
LeetCode300-最长上升子序列
给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/longest-increasing-subsequence著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 public int lengthOfLIS(int[] nums) {原创 2020-07-02 07:53:19 · 116 阅读 · 0 评论 -
LeetCode139-单词拆分
LeetCode139——单词拆分给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入: s = “leetcode”, wordDict = [“leet”, “code”]输出: true解释: 返回 true 因为 “leetcode” 可以被拆分成 “leet code”。示例 2:输入: s = “applepena原创 2020-06-23 23:49:19 · 204 阅读 · 0 评论 -
LeetCode84 柱状图中最大的矩形 单调栈实现
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。示例:输入: [2,1,5,6,2,3]输出: 10之前在CCF中遇到过,纯暴力解法,但是在LC...原创 2020-04-11 08:57:23 · 288 阅读 · 0 评论 -
非递归的二叉树遍历
前序public List<Integer> preorderTraversal(TreeNode root){ List<Integer> result = new ArrayList<>(); if(root == null){ return result ; } St...原创 2020-04-08 14:33:03 · 186 阅读 · 0 评论 -
N皇后问题
N皇后问题题目描述N皇后问题是指在N*N的棋盘上要摆N个皇后,要求任何两个皇后不同行,不同列也不再同一条斜线上,求给一个整数n,返回n皇后的摆法。输入描述:输出一个整数,代表n(1≤n≤14)。输出描述:输出一个整数,代表n皇后的种数。import java.util.Scanner;public class NQueen{ public static int res...原创 2019-11-13 13:51:09 · 709 阅读 · 0 评论 -
CCF俄罗斯方块
问题描述试题编号: 201604-2试题名称: 俄罗斯方块时间限制: 1.0s内存限制: 256.0MB问题描述: 问题描述 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏。 游戏在一个15行10列的方格图上进行,方格图上的每一个格子可能已经放置了方块,或者没有放置方块。每一轮,都会有一个新的由4个小方块组成的板块从方格图的上方落下,玩家可以操作板块左右移动放到合适...原创 2019-09-04 16:21:49 · 119 阅读 · 0 评论 -
CCF CSP 公共钥匙盒
问题描述试题编号: 201709-2试题名称: 公共钥匙盒时间限制: 1.0s内存限制: 256.0MB问题描述: 问题描述 有一个学校的老师共用N个教室,按照规定,所有的钥匙都必须放在公共钥匙盒里,老师不能带钥匙回家。每次老师上课前,都从公共钥匙盒里找到自己上课的教室的钥匙去开门,上完课后,再将钥匙放回到钥匙盒中。 钥匙盒一共有N个挂钩,从左到右排成一排,用来挂N个教室的钥匙...原创 2019-08-21 21:44:48 · 277 阅读 · 0 评论