
数据结构和算法
文章平均质量分 80
Nice2cu_Code
立志成为一个前端、后端、测试全方位发展的程序员
展开
-
Leetcode(力扣)超高频题讲解(三)
高频题(三)目录:Leetcode(力扣)超高频题讲解(一)Leetcode(力扣)超高频题讲解(二)文章目录高频题(三)一、螺旋矩阵II(59)二、螺旋矩阵(54)三、岛屿的最大面积(695)四、岛屿数量(200)五、反转链表II(92)六、用栈实现队列(232)七、用队列实现栈(225)1. 两个队列2. 一个队列八、二叉树的右视图(199)1. BFS2. DFS九、链表中倒数第K个节点(剑指Offer22)十、链表的中间节点(876)1. 奇数返回中点,偶数返回上中点2. 奇数返回中点,偶数原创 2022-02-08 12:01:31 · 1026 阅读 · 0 评论 -
Leetcode(力扣)超高频题讲解(二)
高频题(二)目录:Leetcode(力扣)超高频题讲解(一)文章目录高频题(二)一、相交链表(160)1. 双指针2. 哈希表二、二叉树的先序、中序、后序遍历(144、94、145)1. 前序2. 后序3. 中序三、二叉树的层序遍历(102)四、二叉树的锯齿形层序遍历(103)五、买卖股票的最佳时机(121)1. 暴力解法2. 一次遍历六、有效的括号(20)七、字符串相加(415)八、合并两个有序数组(88)1. 合并后排序2. 双指针(从前往后)3. 双指针(从后往前)九、二分查找(704)十、搜索原创 2022-01-27 18:30:36 · 1241 阅读 · 0 评论 -
Leetcode(力扣)超高频题讲解(一)
高频题(一)文章目录高频题(一)一、反转链表(206)1. 双指针迭代2. 递归二、无重复字符的最长字串(3)三、LRU缓存机制(146)1. 题目描述2. LRU算法的介绍3. 数据结构的选择4. 代码实现四、数组中的第k个最大元素(215)1. 快排变形2. 大顶堆五、K个一组翻转链表(25)六、两数之和(1)1. 一遍哈希表2. 两遍哈希表七、三数之和(15)八、环形链表II(142)1. 哈希表2. 快慢指针九、环形链表(141)1. 哈希表2. 快慢指针十、合并两个有序链表(21)1. 递归2.原创 2022-01-21 18:24:28 · 1891 阅读 · 0 评论 -
数据结构之跳表
跳表本文参考资料为极客时间专栏数据结构与算法之美文章目录跳表一、什么是跳表二、跳表的基本特点三、高效的动态插入和删除1. 插入2. 删除四、索引动态更新五、为什么Redis要用跳表来实现有序集合?六、总结一、什么是跳表对于一个单链表来讲,即便链表中存储的数据是有序的,如果想要在其中查找某个数据,也只能从头到尾遍历链表。这样查找效率就会很低,时间复杂度会很高,是 O(n),如下图所示:如果每两个结点提取一个结点到上一级,对链表建立一级“索引”,查找起来就会更快一些,把抽出来的那一级叫做索引或索引层原创 2021-06-16 12:40:39 · 994 阅读 · 0 评论 -
布隆过滤器
布隆过滤器快速入门Redis的文章,传送地址:入门Redis看这篇就够了文章目录布隆过滤器一、介绍二、添加三、查询四、删除五、优缺点1. 优点2. 缺点六、误判率七、解决Redis缓存穿透问题一、介绍布隆过滤器是一个二进制数组,它的作用是判断一个数是否存在于这个数组,0表示不存在,1表示存在,如下图所示:二、添加如果要存入 “你好” 这个字符串,首先会经过n个哈希函数计算,会计算出不同的哈希值,然后将这几个哈希值映射到数组中,对应的位置的二进制数被修改为1,如下图所示:下标为3、5、7的位原创 2021-06-15 08:47:48 · 638 阅读 · 1 评论 -
为什么数组下标从0开始编号?
数组文章目录数组1. 如何实现随机访问?2. 为什么数组要从 0 开始编号?1. 如何实现随机访问?int[] a = new int[10]来举例,计算机给数组 a[10],分配了一块连续内存空间 1000~1039(数组的内存空间必须是连续的,否则无法随机访问),其中,内存块的首地址为 base_address = 1000,如下图所示:计算机通过地址来访问内存中的数据。当计算机需要随机访问数组中的某个元素时,它会首先通过下面的寻址公式,计算出该元素存储的内存地址:a[i]_address原创 2021-06-02 12:33:29 · 686 阅读 · 0 评论 -
LRU (最近最少使用页面置换算法) 的代码实现
阅读之前推荐先阅读博主关于LinkedHashMap的文章,传送地址:LinkedHashMap源码分析,基于JDK1.8逐行分析LRU算法的实现文章目录LRU算法的实现1. 题目描述2. LRU算法的介绍3. 数据结构的选择3.1 为什么不使用数组?3.2 为什么不使用单向链表?3.3 为什么使用HashMap + 双向链表?4. 代码实现方式一5. 代码实现方式二1. 题目描述运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制实现 LRUmap 类:LRUmap(原创 2021-04-28 07:44:31 · 2902 阅读 · 0 评论 -
八大排序算法汇总 原理+图解+源码+复杂度分析
排序算法文章目录排序算法一、冒泡排序二、选择排序三、插入排序四、归并排序1. 递归方式2. 非递归方式五、快速排序六、堆排序七、桶排序1. 计数排序2. 基数排序八、希尔排序排序算法总结一、冒泡排序原理将相邻两个数比较,将较大值移至后方,第一轮可将最大值移至最后方,第二轮可将前n - 1个数的最大值移至倒数第二个位置,持续此过程,比较n - 1轮,每一轮的比较次数都比上一轮少一次,第一轮需比较n - 1次图解代码public class BubbleSort { publ原创 2021-03-28 19:56:02 · 734 阅读 · 0 评论 -
递归算法复杂度分析之Master公式
master公式的使用如果一个递归问题的求解思路满足:T(N) = a * T(N / b) + O(Nd),其中:N表示问题的规模,a,b,d均为常数,则(1) logba > d 表示复杂度为:O(Nlogba)(2) logba = d 表示复杂度为:O(Nd * logn)(3) logba < d 表示复杂度为:O(Nd )举个例子:在一个数组中找一个最大的数,可以将数组一分为二,左边找一个最大数,右边找一个最大数, 二者比较即可得到数组的最大数,持续一分为二,将问题规模原创 2021-03-28 18:21:43 · 297 阅读 · 0 评论 -
算法复杂度分析
复杂度分析文章目录复杂度分析一、时间复杂度二、空间复杂度一、时间复杂度计算时间复杂度的方法:只保留去掉系数的最高阶项,且一般讨论的都是最坏情况下的复杂度,如:T(n) = 2n2 + 7n + 1 => O(n2)常见的时间复杂度及排序:O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(nk) < O(2n) < O(n!)常见的时间复杂度分析:① 常数阶:O(1)只原创 2021-03-28 18:20:21 · 290 阅读 · 0 评论 -
快速理解红黑树,从二叉排序树 → AVL树 → 红黑树的演变
Git & GitHub 思维导图持续更新图中所有知识点~原创 2020-08-05 16:18:57 · 1273 阅读 · 0 评论