自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 Trie树

又称单词查找树,字典树,前缀树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。class Trie { Trie[] next; boolean isEnd = false; public Trie() { next = new Trie[26]; } .

2021-04-19 17:23:55 86

原创 算法题解3

061、LeetCode26-删除有序数组中的重复项(双指针)本题目一道衍生题详见:leetcode-27. 移除元素,两道题目都是使用双指针的做法来求解,两道题目都限制我们只能使用原地算法,不可以使用额外的空间。针对26题:起始左右指针在索引为0和1处如果发现左右指针指向的元素相等,移动右指针+1如果不相等,将右指针的值覆盖到左指针的下一个元素中最后返回左指针的索引+1,即为新数组的大小/** * 时间复杂度:O(n) n为数组的长度 * 空间复杂度:O(1) */class S

2021-04-19 17:22:42 91

原创 算法题解2

033、LeetCode688-“马”在棋盘上的概率(dfs,dp)本题目可以很简单的用dfs做出来,但是时间复杂度较高。思路:模拟马在棋盘上走,对走到的任意一地方如果不在就返回0如果在就继续走,当走的步数等于K,发现还在棋盘中就返回0对返回的8个方向的数据取平均数/** * 时间复杂度:O(8 ^ k) 每次能往8个方向走,一共能走K次 * 空间复杂度:O(K) 递归栈 */class Solution { // 移动的方向 int[][] move = {

2021-04-19 17:21:41 675

原创 二分问题

1、说明二分是一个理解起来比较简单,但是实际做起来边界情况非常复杂的问题。大量的题目可以使用二分来做,但是细节问题非常复杂在没有详细了解二分之前,以下几个问题我是没有概念的:是while(left <= right)还是while(left < right)?是mid = (left + right) / 2 还是mid = (left + right + 1) / 2?为什么有时候直接return left就可以,为什么有时候就直接在循环内返回了?2、解释本文并不

2021-04-09 11:44:19 441

原创 序列化和反序列化

序列化说的是对象,静态字段不属于对象,所以无法序列化1、为什么需要序列化对于一个复杂的对象,因为对象中到处引用,导致这个对象在堆内存中到处都是,比较凌乱,当想要将这个对象传输到另一台机器(RPC)时,不是很方便,所以需要将它序列化。通常将对象变为文件(text)或者二进制流(binary),然后就可以传输,在远端可以重构出来(反序列化)把对象的字节序列永久地保存在硬盘上,通常存放在一个文件中(内存吃不消的情况下)在网络上传送对象的字节序列(RPC),接收方通常需要反序列化将二进制流生成为对象2

2021-03-27 14:56:30 79

原创 算法题解2

033、LeetCode688-“马”在棋盘上的概率(dfs,dp)本题目可以很简单的用dfs做出来,但是时间复杂度较高。思路:模拟马在棋盘上走,对走到的任意一地方如果不在就返回0如果在就继续走,当走的步数等于K,发现还在棋盘中就返回0对返回的8个方向的数据取平均数/** * 时间复杂度:O(8 ^ k) 每次能往8个方向走,一共能走K次 * 空间复杂度:O(K) 递归栈 */class Solution { // 移动的方向 int[][] move = {

2021-03-27 14:28:21 1094

原创 java并发和内存

Java并发和内存1、三个性质1.1、原子性指事务的不可分割性,一个事务的所有操作要么不间断地全部被执行,要么一个也没有执行。Java原子性的理解:这个(些)指令不可以再被分割Java违反了原子性会引发指令交错的现象,这里的交错指的是多个线程执行指令的交错synchronized可以解决原子性问题,volatile不可以1.2、可见性可见性指的是,当一个线程对一个共享变量进行写操作后,另一个线程会不会立即收到最新的结果为什么会出现可见性问题? ——> JMM + CPU缓存结构如

2021-03-23 23:15:30 132

原创 Java 深浅拷贝

引用拷贝、对象拷贝、浅拷贝、深拷贝1、什么是引用拷贝拷贝时只拷贝了一个对象的引用,使得拷贝引用和被拷贝引用指向同一个对象Student a = new Student();Student b = a;2、什么是对象拷贝拷贝时会将待拷贝的对象创建一个新的放在堆中,然后生成一个新的引用指向它。前提是Student重写了了clone方法,注意不需要非得继承Cloneable接口,只是一个声明接口clone()接口是Object类中一个protected final方法Student a =

2021-03-23 16:34:43 78

原创 java 集合容器

Java ContainerContainer 容器是什么?用来组织多个相同类型的数据,进行增删改查操作的集合Java中已经有数组了,为什么还需要Container?数组长度固定、集合长度可变,数组不可以满足我们的自定义要求,如:按照一定顺序存取, 一组数据之间不能相同1、继承关系四大接口:Set、List、Queue、MapSet的重要实现类:HashSet、LinkedHashSet、TreeSetQueue重要的实现类:PriorityQueue、LinkedListL

2021-03-23 16:33:56 152

原创 concurrenthashmap源码分析

ConcurrentHashMapJava7ConcurrentHashMap是一个线程安全的map集合多线程下的hashmap有什么问题?JDK1.7:死链、元素覆盖JDK1.8:元素覆盖1、底层数据结构Segment数组(每个里面是HashEntry数组 + 链表),ConcurrentHashMap(分段锁) 对整个桶数组进行了分割分段(Segment),每一把锁只锁容器其中一部分数据,多线程访问容器里不同数据段的数据,就不会存在锁竞争,提高并发访问率。// jdk1.7st

2021-03-23 16:33:29 113

原创 jvm垃圾回收

JVM垃圾回收1、垃圾回收概述垃圾收集的三个经典问题哪些内存需要回收?什么时候回收?如何回收?1.1、什么是垃圾“An Object is considered garbage when it can no longer be reached from any pointer in the running program”垃圾是指在运行的程序中没有任何指针指向的对象,占据了无效的内存空间1.2、为什么需要垃圾回收如果不及时对内存垃圾进行回收清理,那么这些垃圾所占用的空间会一直保

2021-03-23 16:31:54 153

原创 arraylist源码分析

ArrayList源码分析1、成员变量public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ private static final long serialVersionUID = 8683452581122892189L; private static

2021-03-23 16:30:12 93

原创 arrays.copyof() 和 system.arraycopy()的区别和联系

Arrays.copyOf() 和 System.arraycopy()的区别和联系1、System.arraycopy方法作用:将源数组的一段 复制到 目标数组中的某个地方@HotSpotIntrinsicCandidatepublic static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);

2021-03-23 16:29:06 380

原创 linkedlist源码分析

LinkedList源码分析public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{ ..}LinkedList实现了Deque接口,可以将LinkedList当做队列使用;实现了cloneable表示能被克隆,实现了Serializa

2021-03-23 16:28:03 151

原创 SkipList跳表

SkipList一种让排序链表的查找的复杂度能降低到O(logn)级别的数据结构相当于给排序链表加了索引使其能用二分来查找// 每一层都是一个 sorted linkedlist// 上面一层的元素是下层元素的一半, 均匀分布1---------------------->9 // cache11---------->5---------->9 // cache21---->3---->5---->7---->9 // cache3

2021-03-21 17:58:17 127

原创 最小生成树问题

最小生成树问题简介最小生成树是一副连通加权无向图中一棵权值最小的生成树。最小生成树是图论算法中比较经典的问题,在现实生活中也有非常多的应用。有两种比较经典的算法,都是使用了贪心的思想解决:Prim算法(普利姆算法)Prim算法的每一步都会为一棵生长中的树添加一条边,该树最开始只有一个顶点,然后会添加{V-1}个边。每次总是添加生长中的树和树中除该生长的树以外的部分形成的切分的具有最小权值的横切边。Prim算法的时间复杂度为{O(E + VlogV)}。Kruskal算法(克鲁斯克尔算法)

2021-03-21 17:52:42 625 1

原创 最大堆_最小堆

最大堆 / 最小堆1、什么是堆?堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:堆中某个节点的值总是不大于或不小于其父节点的值;堆总是一棵完全二叉树。完全二叉树:若设二叉树的深度为k,除第 k 层外,其它各层 (1~k-1) 的结点数都达到最大个数,第k 层所有的结点都连续集中在最左边,这就是完全二叉树。满二叉树:一棵二叉树的结点要么是叶子结点,要么它有两个子结点(如果一个二叉树的层数为K,且结点总数是(2^k)

2021-03-21 17:51:21 138

原创 字符串匹配算法

字符串匹配算法1、KMP算法KMP算法是模式串匹配算法,由三位学者一起发明,故将他们首字母组合命名,算法可以将字符串匹配的时间复杂度降低到O(m + n)级别用法:字符串匹配时间复杂度:O(m + n), 文本串加模式串的长度空间复杂度:O(n) next数组长度,也就是模式串长度1.1、思想首先我们来看一下,对于一个字符串,它的前缀是什么,后缀呢?前缀:包含首字符,不包含尾字符的所有子串后缀:包含尾字符,不包含首字符的所有子串s = "aabaaf";// 前缀 /

2021-03-21 17:41:58 345 1

原创 Top K问题

Top K问题1、TopK是什么从长度为N的无序数组中找出前k大的数,这就是所谓的Top k问题2、分析解决之所以这个问题比较经典,原因在于这个数组的长度太大(超过1亿),以至于无法一次下放到内存中进行排序,所以才会被人研究。2.1、hash使用hash的作用是减少重复数量,但是要注意的是,题目求的是排位是第K大的数还是求第K大个数字如果是前者我们就不可以使用hash来降低数据规模2.2、堆使用堆这样的数据结构可以在内存消耗为K时解决此问题,一般来说:对于求前K大,我们用小顶堆,前K小

2021-03-21 17:41:10 176

原创 投票算法

投票算法 / Boyer-Moore算法该算法可以用O(n)的时间复杂度和O(1)的空间复杂度找到其中的多数元素。给定一个大小为 n 的数组,多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素1、算法步骤需要对原数组进行两趟扫描,并且简单易实现。第一趟扫描我们得到一个候选节点candidate,第二趟扫描我们判断candidate出现的次数是否大于n/2。第一趟扫描中,我们需要记录2个值:candidate,初值可以为任何数,第二个count,初值为0。之后,对于数组中每一个元素,首先判断co

2021-03-18 11:25:48 744 2

原创 排序算法

排序算法均按照升序演示排序算法的稳定性:如果相等的两个元素,在排序前后的相对位置保持不变,我们就称为是稳定的排序算法,否则是不稳定的。原地算法 In-place:不依赖额外的资源或依赖少数的额外资源,仅依靠输出来覆盖输入,空间复杂度为O(1)的都可以认为是原地算法1、冒泡排序(Bubble Sort)时间复杂度:O(n^2) 空间复杂度O(1) 可以是稳定的排序算法思想:从头开始比较相邻的一对元素,如果左边的比右边的大,就交换两数位置忽略到最大的元素,从剩下的元素中进行一边冒泡排序,直到

2021-03-18 11:24:39 242

原创 链表翻转的算法

链表翻转的算法1、递归实现class Solution { public ListNode reverseList(ListNode head) { if(head == null || head.next == null) { return head; } ListNode cur = reverseList(head.next); head.next.next = head; head.n

2021-03-18 11:24:06 53

原创 回溯算法

回溯算法https://www.bilibili.com/video/BV1cy4y167mM/https://leetcode-cn.com/problems/subsets/solution/78-zi-ji-hui-su-sou-suo-fa-jing-dian-ti-mu-xiang-2/https://mp.weixin.qq.com/s/r73thpBnK1tXndFDtlsdCQ1、概述回溯算法并不是一种很高效率的算法,它只是一种在for循环嵌套暴力搜索时候写不出来解法的替代品,

2021-03-18 11:23:20 202

原创 二叉树的三种迭代遍历

二叉树的三种迭代遍历二叉树的三种遍历方式分别是前序、后序、中序。其递归方式比较简单,此处用栈模拟递归来描述二叉树的三种遍历方式的迭代版本1、前序遍历先到最左边节点,一路上收集左节点到栈中,并保存到结果集。之后不断出栈,并对出栈结果的右节点进行如上操作class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> ans = new Arr

2021-03-18 11:22:38 318

原创 并查集

并查集并查集模板// 该模板结合了size和rank和优化,使用时自取即可class DSU { // p : parents数组 // sz:size数组,代表的是当前圈子里的数量 // rank:rank数组,用于合并时降低树的高度 int[] p, sz, rank; DSU(int N) { p = new int[N]; for(int i = 0; i < N; i++) p[i] =

2021-03-18 11:21:34 53

原创 LRU算法

LRU1、用Java自带的LinkedHashMap实现public class LRUCache { int capacity; Map<Integer, Integer> map; public LRUCache(int capacity) { this.capacity = capacity; map = new LinkedHashMap<>((int)((float)capacity / 0.75f + 1.0f

2021-03-18 11:20:35 47

原创 0-1背包问题

0 / 1 背包问题(0 / 1 knapsack problem)背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。相似问题经常出现在商业、[组合数学],[计算复杂性理论]、[密码学]和[应用数学]等领域中。也可以将背包问题描述为决定性问题,即在总重量不超过W的前提下,总价值是否能达到V。1、题目描述

2021-03-18 11:19:01 148

原创 算法题解

001、LeetCode134—加油站(贪心)一开始没想太多,暴力O(n^2)class Solution { public int canCompleteCircuit(int[] gas, int[] cost) { for(int i = 0; i < gas.length; i++) { // 如果可以走一圈,直接返回即可 if(cycle(gas, cost, i)) return i; }

2021-03-18 11:14:14 1586 4

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除