自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 链表上LRU缓存淘汰算法原理

单链表:查找时间复杂度O(n),单独的删除和插入操作时间复杂度为O(1),但是实际删除肯定要遍历找到目标节点再删除时间复杂度为O(n)。循环链表:处理的数据具有环型结构特点时,就特别适合采用循环链表,比如大名鼎鼎的约瑟夫问题双向链表:向链表要比单链表占用更多的内存空间,但可以支持双向遍历。双向链表可以支持 O(1) 时间复杂度的情况下找到前驱结点,正是这样的特点,也使双向链表在某些情况下的插入、删除等操作都要比单链表简单、高效。在实际的软件开发中,从链表中删除一个数据无外乎这两种情况:

2021-06-28 21:32:03 77

原创 线性表-数组

数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。为什么数组下标从0开始:a[k]_address = base_address + k * type_size这是数组的寻址公式,如果下标从0开始,寻址公式就变成a[k]_address = base_address + (k-1)*type_size这样每次随机访问数组元素都多了一次减法运算,对于 CPU 来说,就是多了一次减法指令。数组最主要特点:最大的特点就是支持随机访问,但插入、删除操作也

2021-06-28 14:23:01 225

原创 复杂度分析下

这篇博客简单总结了最好情况时间复杂度、最坏情况时间复杂度、平均情况时间复杂度、均摊时间复杂度 四种复杂度。分析这四种复杂度得原因是同一段代码,在不同输入的情况下,复杂度量级有可能是不一样的。首先根据以下代码快速理解前三种复杂度:// n表示数组array的长度int find(int[] array, int n, int x) { int i = 0; int pos = -1; for (; i < n; ++i) { if (array[i] == x) {

2021-06-28 11:50:05 106

原创 复杂度分析上

什么是复杂度分析:1.数据结构和算法需要研究如何更快更省解决问题,因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。2.分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度。3.复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。为什么要进行复杂度分析:1.我们需要一个不用具体的测试数据来测试,就可以粗略地估计算法的执行效率的方法2.和性能测试相比,复杂度分析有不依赖执行环境、成本低、效率高、易操作、指导性强的特点。3.掌握复杂度分析,将能编写出性能更优的

2021-06-28 01:41:18 189

原创 如何系统高效学习数据结构与算法

是什么:数据结构指的是“一组数据的存储结构(图书馆的书架)”,算法指的是“操作数据的一组方法(在图书馆找书用到的方法)”。数据结构是为算法服务的,算法是要作用再特定的数据结构上的。学什么:效率和资源消耗的度量衡–复杂度分析。最常用、最基础的20个数据结构与算法,学习他们的:“来历”、“特点”、“适合解决什么问题”和“实际的应用场景”。数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie树算法: 递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字

2021-06-28 00:20:35 129

原创 面试题 17.24. 最大子矩阵

LeetCode原题:面试题 17.24. 最大子矩阵题目描述:*给定一个正整数、负整数和 0 组成的 N × M 矩阵,编写代码找出元素总和最大的子矩阵。返回一个数组 [r1, c1, r2, c2],其中 r1, c1 分别代表子矩阵左上角的行号和列号,r2, c2 分别代表右下角的行号和列号。若有多个满足条件的子矩阵,返回任意一个均可。注意:本题相对书上原题稍作改动示例:输入:[[-1,0],[0,-1]]输出:[0,1,0,1]解释:输入中标粗的元素即为输出所表示的矩阵说明

2021-06-03 00:11:22 176

原创 动态规划-673. 最长递增子序列的个数

题目描述:给定一个未排序的整数数组,找到最长递增子序列的个数。示例 1:输入: [1,3,5,4,7]输出: 2解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。示例 2:输入: [2,2,2,2,2]输出: 5解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数。题目来源:673. 最长递增子序列的个数1.定义状态:记录最长长度dp[i]:到nu

2021-05-30 16:51:11 507

原创 25. K 个一组翻转链表

题目解析:(题目来源:25. K 个一组翻转链表)给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。进阶:你可以设计一个只使用常数额外空间的算法来解决此问题吗?你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。这道题目是反转链表的升级,它指定了反转链表的个数,当个书不够时直接原样返回。看一下进阶说的是常数额外空间去解决,意思就是让我们不要开辟额外的空间,直

2021-05-17 18:17:04 57

原创 23. 合并K个升序链表

题目解析:(题目来源:23. 合并K个升序链表)给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[1->4->5,1->3->4,2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6用的方法比较好想,也

2021-05-06 23:19:38 52

转载 ListNode res = new ListNode(0) 和 ListNode res = null 的区别

ListNode list=new ListNode() 初始化一个空节点,无值,不提倡此种写法。ListNode list=new ListNode(0) 初始化一个节点值为0的空节点,最常用最正规写法。ListNode list=null 为空,什么都没有,一般不这么写。...

2021-05-06 22:38:41 998

原创 19. 删除链表的倒数第 N 个结点

题目描述:(题目来源:19. 删除链表的倒数第 N 个结点)给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]这一题有个简单的方法就是快慢指针法(定位链表中的特定位置),快指针和慢指针最初都指向头节点。一:先让快指针往后走n步,然后判断快指针是否为null,如果为null,证明这个n就是链表的长度,我们把第一个结点删除返回head.next就行了。二:如果不为nu

2021-05-06 14:02:17 60

原创 17. 电话号码的字母组合

题目描述:(题目来源leetcode:17. 电话号码的字母组合)给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。分析:面对这样的遍历各种可能情况的问题,首先想到的应该就是回溯法求解。我看了官方的题解,感觉他用了太多参数对于新手很不友好。后来在评论区找到了一个大佬的答案,清晰明了,上代码:class Solution { private String[] map = {"a

2021-05-04 00:36:52 87

空空如也

空空如也

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

TA关注的人

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