数据结构与算法
文章平均质量分 53
不努力就种地~
problems will always solved on keep coding
展开
-
LeetCode 206. 反转链表 java版 多种简单方式,总有一款适合你!超级简单易懂的反转链表 java
使用自定义容器类,链表放入容器类。使用容器方法removeFirst, addFirst 将老链表数据转换新容器对象内。迭代链表,每次new一个节点,并将老节点放入newNode 的next。我认为这种很容易理解,当然缺点就是每次new一个对象。如果觉得困难 建议debug, 跟下。多看代码,多思考,相信很快就明白了。链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?采用栈,先进后出思路解决。,请你反转链表,并返回反转后的链表。原创 2024-04-17 14:56:26 · 412 阅读 · 0 评论 -
LeetCode 628. 三个数的最大乘积 java版
思路:1. 给数组排序 (Arrays.sort),如果没有这个sort 你会用什么排序呢?2. 同上,计算最大数乘积,与最小数 * 次最小数 * 最大数乘积,判断最大值。5. 排序算法: 冒泡,快排,堆排序,插入,希尔排序?,还记得思路以及实现代码吗?3. 两个负数和一个正整数乘积,也需要加入判断。,在数组中找出由三个数组成的最大乘积,并输出这个乘积。2. 取数组最大三个数相乘。,一次遍历找出五个数,可以不用排序算法,再进行判断。解1的延伸,解1 是排序,找到。原创 2024-04-16 16:44:20 · 232 阅读 · 0 评论 -
Leetcode 146. LRU 缓存。 手撕lru? 面试官让手写lru?java版本lru
当访问一个节点时,如果节点存在,我们将其从原来的位置删除,并重新插入到链表头部。这样就能保证链表尾部存储的就是最近最久未使用的节点,当节点数量大于缓存最大空间时就淘汰链表尾部的节点。当插入一个节点时,如果节点存在,我们将其从原来的位置删除,并重新插入到链表头部。如果不存在,我们首先检查缓存是否已满,如果已满,则删除链表尾部的节点,将新的节点插入链表头部。// 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}// 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}// 缓存是 {1=1}原创 2024-03-26 11:14:50 · 611 阅读 · 0 评论 -
Leetcode 76 最小覆盖子串 java版
1. 问题:给你一个字符串s、一个字符串t。返回s中涵盖t所有字符的最小子串。如果s中不存在涵盖t所有字符的子串,则返回空字符串""。tts"BANC"最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。"a"整个字符串 s 是最小覆盖子串。""t 中两个字符 'a' 均应包含在 s 的子串中,因此没有符合条件的子字符串,返回空字符串。t2. 滑动窗口(author: mcdnull):分为left, right 两个指针。先让right 往右侧移动。原创 2024-03-25 14:42:54 · 532 阅读 · 0 评论 -
Leetcode 26. 删除有序数组中的重复项 java版。 java解决删除重复数组元素并输出长度
注: 我发现很多题,都用到了双指针解决,比如二分,比如合并两个有序数组,合并两个有序链表!很妙的一个解决方式。// 长度正确的期望答案。如果所有断言都通过,那么您的题解将被。:两个字段p,q. p我认为就是我上面的第一层循环,q第二层循环。,返回删除后数组的新长度。删除重复出现的元素,使每个元素。原创 2024-03-05 10:18:03 · 411 阅读 · 0 评论 -
Leetcode 112. 路径总和 java解决给定一个值判断二叉树根节点到叶子节点总和是否相等 算法
对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。2. 前几天面试,给我出的一道题,很简单没有答出来。这几天重新复习了下二叉树,广度优先遍历,深度优先遍历,以及前序,中序,后序递归,这些都复习到,这道题基本就搞定了。4. 这些知识点后续单开一篇记录下,知道平衡二叉树的一些逻辑,那这个题就很简单了。深度为k,有2^k-1个节点的二叉树 (个人理解:节点的子元素有左子树,右子树也不能空着)示例用的是数组表示的,不好理解。原创 2024-02-29 14:34:32 · 503 阅读 · 0 评论 -
Leetcode 134. 加油站 java版 如何解决环路加油站算法
你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油。开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油。开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油。开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油。开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油。原创 2024-02-27 10:32:21 · 362 阅读 · 0 评论 -
算法 杨辉三角求解 java打印杨辉三角 多路递归打印杨辉三角 递归优化杨辉三角 记忆法优化递归 帕斯卡三角形 算法(十二)
6. 当前版本可优化地方,同之前相同,用数组当缓存,存储之前计算得值。1. 每个数等于它上方两数之和。行 i,列 j ,那么 [i][j] 的取值应为 [i-1]*[j-1] + [i-1][j]4. 前n行共[(1+n)n]/2 个数。3. 第n行的数字有n项。当i=0 或 i=j 时, [i][j]值为1。(1623----1662)在1654年发现这一。,即为从n-1个不同元素中取m-1个元素的组合数。7. 非递归方式解决,采用直接计算好每行的值。在三角形中的一种几何排列,中国南宋数学家。原创 2023-09-20 17:34:23 · 196 阅读 · 0 评论 -
算法 数据结构 斐波那契数列 递归实现斐波那契数列 斐波那契递归的优化 斐波那契数列递归求解 多路递归实现 斐波那契算法系列 数据结构(十一)
排查发现:当n=46是正常的,n=47时,前面两个值的相加已经超过了int最大值int.max_value= 21 4748 3647 所以出现负数。使用数组进行优化,也有一个问题,数组只有n-1, n-2两个值有用。对于计算之后,存储前面n-3的值没有了意义;尾递归(防止栈溢出) + 只取n-1, n-2的值流转。使用数组,存储之前计算的数据,减少计算次数。这种方法直接用数组去存储前面计算的值,不用重复计算。之前的例子是每个递归函数只包含一个自身的调用,这称之为 single recursion。原创 2023-09-07 10:19:06 · 760 阅读 · 0 评论 -
LeetCode 70. 爬楼梯 计算爬楼梯共计多少种方法可达
所以我们得到公式 dp[n]=dp[n−1]+dp[n−2]dp[n]=dp[n−1]+dp[n−2]本问题其实常规解法可以分成多个子问题,爬第n阶楼梯的方法数量,等于 2 部分之和。它的解法数量依次是: 1, 2,3, 5, 8,13.同时需要初始化 dp[0]=1dp[0]=1 和 dp[1]=1dp[1]=1。爬上 n−1n−1 阶楼梯的方法数量。因为再爬1阶就能到第n阶。爬上 n−2n−2 阶楼梯的方法数量,因为再爬2阶就能到第n阶。1. 1 阶 + 1 阶 + 1 阶。原创 2023-05-31 14:59:18 · 776 阅读 · 0 评论 -
算法 数据结构 递归插入排序 java插入排序 递归求解插入排序算法 如何用递归写插入排序 插入排序动图 插入排序优化 数据结构(十)
是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。最坏的情况是待排序数组是逆序的,此时需要比较次数最多,总次数记为:1+2+3+…+N-1,所以,插入排序最坏情况下的时间复杂度为O(在插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较N- 1次,时间复杂度为O(n)对于两个相同的数,经过排序后,他们依旧保持之前的顺序,二者次序没有发生变化。插入排序是算法稳定的。原创 2023-09-06 09:21:29 · 321 阅读 · 0 评论 -
算法 数据结构 递归冒泡算法 java冒泡算法 优化递归冒泡 数据结构(九)
优化数组稳定得情况, 减少无意义遍历,新增参数x, 标识是否发生了挪动,递归时使用x索引,非常巧妙。原创 2023-09-05 16:47:10 · 703 阅读 · 0 评论 -
算法 数据结构 双向链表 手撸双向链表 双向链表实现容器 双向链表添加修改删除获取大小 双向链表实现自定义容器 双向链表数据结构 双向链表手写LinkedList容器 双向哨兵链表 数据结构(五)
1. 双向链表同单向链表一样,同sentinelLinkedList相同的方法,感觉还没有单向链表难。Node 结构 新增prev node,容器外新增tail节点。2. 建议先不要看我写得源码自己手动实现,只将Node内部类复制自己命名得容器内,手动实现之后(每个功能只实现一种也可以),再回头参照,思考下即可!(手动维护一个size变量,实现0(1)复杂度 )(添加到头部,尾部添加,指定位置添加)(获取首部,获取尾部,获取指定位置)(删除首部,删除尾部,删除指定位置)(实现迭代器,能够循环遍历)原创 2023-09-04 09:04:32 · 44 阅读 · 0 评论 -
算法 数据结构 双向环形链表 手撸环形链表 环形链表实现容器 环形链表添加修改删除获取大小 环形链表实现自定义容器 手撸容器 双向环形哨兵链表 数据结构(六)
d. size方法(手动维护一个size变量,实现0(1)复杂度 )c. remove方法(删除首部,删除尾部,删除指定位置)a. add方法(添加到头部,尾部添加,指定位置添加)b. get方法(获取首部,获取尾部,获取指定位置)e. 迭代器(实现迭代器,能够循环遍历)手动实现之后(每个功能只实现一种也可以),再回头参照,思考下即可!2. 建议先不要看我写得自己先实现下,只将Node内部类复制自己命名得容器内,原创 2023-09-04 15:31:02 · 404 阅读 · 0 评论 -
算法 数据结构 什么是递归 递归解决阶乘 阶乘递归代码 递归解决问题 递归反向打印字符串 数据结构(七)
计算机科学中,递归是一种解决计算问题的方法,其中解决方案取决于同一类问题的更小子集。的过程中,外层函数内的局部变量(以及方法参数)并未消失,原创 2023-09-05 10:58:58 · 61 阅读 · 0 评论 -
数据结构 递归解决二分查找 数据结构(八)
【代码】数据结构 递归解决二分查找 数据结构(八)原创 2023-09-05 11:02:13 · 233 阅读 · 0 评论 -
算法 数据结构 链表实现容器 手撸单向链表 单向链表添加修改删除获取大小 链表实现自定义容器 链表数据结构 单向链表手写LinkedList容器 单向哨兵链表 数据结构(四)
一个不参与数据存储的特殊 Node 作为哨兵,它一般被称为哨兵或哑元,拥有哨兵节点的链表称为带头链表。注:大白话就是容器类的this.head 赋值了一个无意义的Node节点,保持head非空。结束位置:如果已知 tail 尾节点是 O(1),不知道 tail 尾节点是 O(n)中间位置:根据 index 查找时间 + O(1)根据 index 查找,时间复杂度 O(n)5. 如测试出现问题,请联系我更正。原创 2023-09-01 16:40:03 · 51 阅读 · 0 评论 -
算法 数据结构数组,动态数组,动态数组扩容,手撸动态数组 ,数组实现自定义容器并实现扩容 数据结构(三)
建议看看arrayDeque源码,ArrayDeque 用数组实现的队列。采用head,tail参数,标记使用与添加的中间值。poll 方法消费队列数据,head会从中间部分值往后自增,poll 消耗完扩容前数据后,head归0,继续消费扩容后的数组部分。1. 由数组实现一个简单容器,并实现扩容。原创 2023-08-31 17:31:39 · 76 阅读 · 0 评论 -
Java 二维数组转字符串 字符串转二维数组 二维数组存txt文件 二维数组和字符串的互相转化 二维数组deepToString反向方法 二维数组存入文件并读取文件转二维数组
a. 二维数组转换为字符串命名为map.txt文件进行存储。b. 读取文件map.txt的字符串,进行二维数组的转换。1) 在前面的基础上,将稀疏数组保存到磁盘上,比如 map.data。2) 恢复原来的数组时,读取 map.data 进行恢复。原创 2023-08-29 14:10:51 · 250 阅读 · 0 评论 -
算法 稀疏数组 数组优化 数组压缩 二维数组转稀疏数组 算法合集(二)
稀疏数组第一行存储原始数组的行信息,列信息,非0值或不同值得个数,进行保存。e. 稀疏数组转换为原始数组(原以为直接两层循环,再判断稀疏数组值是否在此循环内,进行使用,需要多层循环,思路不对。2. 稀疏数组(sparse array) :当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。c. 稀疏数组第一行存储原始数组信息,总共11行11列有2条有效数据,存入稀疏数组。c. 循环原始数组,将黑棋,蓝棋目前的位置信息,存入稀疏数组。1. 五子棋游戏,玩家对战一半,停战。原创 2023-08-29 10:35:33 · 272 阅读 · 1 评论 -
算法 数据结构分类 数据结构类型介绍 数据结构线性非线性结构 算法合集 (一)
链式存储的线性表称为链表,存储的元素不一定是连续的,元素节点中存放的数据元素以及相邻元素的地址信息。顺序存储的的线性表为顺序表,其中元素是连续的。数据与结构存在一对一的线性关系;, 数据结构也是算法的基础。我认为通常都是以空间换时间,时间换空间。总结: 实际解决问题的程序 a.线性结构常见数据结构。原创 2023-08-29 09:36:21 · 654 阅读 · 0 评论 -
java 鸡兔同笼问题,穷举算法解决鸡兔同笼数学问题 鸡兔同笼java求解 算法示例,穷举算法示例
在使用穷举算法时,需要明确问题的答案的范围,这样才可以在指定范围内搜索答案。指定范围之后,就可以使用循环语句和条件判断语句逐步验证候选答案的正确性,从而得到需要的正确答案。,上有三十五头,下有九十四足,问鸡兔各几何?这个问题的大致意思是:在一个笼子里关着若干只鸡和若干只兔,从上面数共有。鸡免同笼问题最早记载于 1500 年前的《孙子算经》,这是我国古代一个非常有名的问题。) 判断结果是否满足要求,如果不满足则执行第(1)步来搜索下一个可能的情况;--pdf,书中提到的其中一种算法思想:穷举。原创 2023-06-20 11:19:54 · 738 阅读 · 0 评论 -
Java 链表对象 链表翻转 对象中有对象的翻转 对象链表翻转指针
【代码】Java 链表对象 链表翻转 对象中有对象的翻转 对象链表翻转指针。原创 2023-02-22 15:02:10 · 72 阅读 · 0 评论 -
LeetCode 35. 搜索插入位置 二分查找 排序数组查找元素 数组中查找某个元素
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。1. 没有学过二分查找(折半查找),就一脸懵逼。还要求时间复杂度为logN =_=!输入: nums = [1,3,5,6], target = 5。输入: nums = [1,3,5,6], target = 2。输入: nums = [1,3,5,6], target = 7。3. 使用二分查找算法,时间复杂度O(logN)时间复杂度为 O(log n)原创 2023-02-08 16:26:02 · 257 阅读 · 0 评论 -
LeetCode 11. 盛最多水的容器 java给定数组求水的容器 给定数组求面积最大 求数组面积最大值 求数组之间包含的最大面积
1. 思路:做了几个题之后,明白效率高的肯定是空间换时间,减少循环次数,参考之前的解题思路, 感觉有点像"滑动窗口", 递归也想过,感觉跟递归不沾边... 还是先写个笨的吧 双重for循环解决,遍历求最大值。解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。,表示 数组中所有的位置都可以作为容器的边界,因为我们还没有进行过任何尝试。双指针代表的是 可以作为容器边界的所有位置的范围。空间复杂度:O(1),只需要额外的常数级别的空间。输入:[1,8,6,2,5,4,8,3,7]原创 2023-02-08 09:19:30 · 272 阅读 · 0 评论 -
LeetCode 17. 电话号码的字母组合 java 计算键盘组合字母 给定参数输出键盘字母组合 求键盘字母组合
回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是不完整的)。每次取电话号码的一位数字,从哈希表中获得该数字对应的所有可能的字母,并将其中的一个字母插入到已有的字母排列后面,然后继续处理电话号码的后一位数字,直到处理完电话号码中的所有数字,即得到一个完整的字母排列。输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]首先使用哈希表存储每个数字对应的所有可能的字母,然后进行回溯操作。输出:["a","b","c"]原创 2023-02-07 17:09:30 · 314 阅读 · 0 评论 -
LeetCode 无重复字符的最长子串 获取字符串中不重复的子串最大长度
2. 发现的套路,使用 map,list, set 或其他数据结构 来装载中间变量。将时间复杂度降低都是以空间换时间 ,我前面写的一篇文章,就是使用map结构。,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters。一直维持这样的队列,找出队列出现最长的长度时候,求出解!原创 2023-02-05 21:53:25 · 381 阅读 · 0 评论 -
leetCode 给定数组,目标值 计算数组下标
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。但是,数组中同一个元素在答案里不能重复出现。链接:https://leetcode.cn/problems/two-sum。链接:https://leetcode.cn/problems/two-sum。商业转载请联系官方授权,非商业转载请注明出处。商业转载请联系官方授权,非商业转载请注明出处。来源:力扣(LeetCode)来源:力扣(LeetCode)原创 2023-02-02 22:21:17 · 586 阅读 · 1 评论 -
leetCode 字符串反转
1. 给定字符串,abcdefg, 或输入一串字符串,进行反转。3. 字符串方法 toCharArray 转换为数组。5. 字符串方法 subString 切割。2. StringBuffer 反转。4. 字符串方法charAt。原创 2023-02-02 20:18:39 · 138 阅读 · 0 评论