数据结构与算法
文章平均质量分 50
数据结构与算法
寅灯
本人爱好互联网技术,乐观开朗,乐于助人!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
给定一个正整数 n ,输出外观数列的第 n 项(java语言)
给定一个正整数 n ,输出外观数列的第 n 项,这是一个经典的算法,leetcode上也有此题,今天我们详细分析一下。1、题目简介如下:/** * 给定一个正整数 n ,输出外观数列的第 n 项。 * * 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。 * * 你可以将其视作是由递归公式定义的数字字符串序列: * * countAndSay(1) = "1" * countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转.原创 2022-05-20 11:08:18 · 852 阅读 · 0 评论 -
请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可
这是一个很好的算法 在leetcode 也曾出现,今天我们详细分析一下:题目简介:/** * 请你判断一个9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 * * 数字1-9在每一行只能出现一次。 * 数字1-9在每一列只能出现一次。 * 数字1-9在每一个以粗实线分隔的3x3宫内只能出现一次。(请参考示例图) * * 注意: * 一个有效的数独(部分已被填充)不一定是可解的。 * 只需要根据以上规则,验证已经填入的数字是...原创 2022-05-17 20:42:28 · 1242 阅读 · 0 评论 -
整数数组 nums 按升序排列,旋转后查询某个值
这是一道常见算法题,leetcode中如下描述:/** * 整数数组 nums 按升序排列,数组中的值 互不相同 。 * * 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转, * 使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。 * 例如, [0,1,2,4,5,6,7] 在下标 3原创 2022-05-12 17:36:44 · 1197 阅读 · 0 评论 -
java语言手动实现双向链表
java语言手动实现双向链表:1、原理图:包含添加的操作2、核心代码:/** * @author wanghuainan * @date 2022/4/13 */public class NanDaoDoubleLinked { public static void main(String[] args) { DoubleLinkNodeList linkNodeListAddHead = new DoubleLinkNodeList(0,0);.原创 2022-04-13 21:36:27 · 870 阅读 · 0 评论 -
java语言手动实现LFU算法策略及原理分析
今天我们通过java语言手动实现LFU算法策略及原理分析,这是redis缓存策略的一种,因此了解次算法及原很有必要;另外,leetcode 也有次题,介绍是这样的:/** * 请你为 最不经常使用(LFU)缓存算法设计并实现数据结构。 * * 实现 LFUCache 类: * * LFUCache(int capacity) - 用数据结构的容量capacity 初始化对象 * int get(int key)- 如果键key 存在于缓存中,则获取键的值,否则返回 -1 。 * v...原创 2022-04-13 21:17:57 · 1338 阅读 · 1 评论 -
采用双向链表手动实现LRU算法
采用双向链表手动实现LRU算法,redis有一种淘汰算法LRU策略,今天我们采用java语言双向链表分享一下:1、leetcode描述;/** * * 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。 void pu..原创 2022-04-07 20:31:19 · 875 阅读 · 0 评论 -
java将所有链表合并到一个升序链表中,返回合并后的链表
优秀算法:1、题目简介:/** * 给你一个链表数组,每个链表都已经按升序排列。 * * 请你将所有链表合并到一个升序链表中,返回合并后的链表。 * 示例 1: * * 输入:lists = [[1,4,5],[2,3,4],[5,6]] * 输出:[1,2,3,4,4,5,5,6] * 解释:链表数组如下: * [ * 1->4->5, * 2->3->4, * 5->6 * ] * 将它们合并到一个有序链表中得到。 * 1-原创 2022-03-28 21:07:17 · 606 阅读 · 0 评论 -
java单向链表实现及原理
单向链表是我们常用的数据结构,今天我们分享一下其实现和原理:1、创建链表:节点元素 public static class ListNode { public int val; public ListNode next; }1.1、笨方式创建 ListNode node = new ListNode(); /** * 最笨的方法创建链表 */ node.val = 1; node.next = new ListNode(); node.next.原创 2022-03-02 21:20:20 · 688 阅读 · 0 评论 -
给出3个参数,N,M,K,怪兽有N滴血,等着英雄来砍自己,英雄每一次打击,都会让怪兽流失[0~M]的血量,到底流失多少?每一次在[0~M]上等概率的获取一个值,求K次打击之后,英雄把怪兽砍死的概率
问题描述:给出3个参数,N,M,K,怪兽有N滴血,等着英雄来砍自己,英雄每一次打击,都会让怪兽流失[0~M]的血量,到底流失多少?每一次在[0~M]上等概率的获取一个值,求K次打击之后,英雄把怪兽砍死的概率例如:int N = 6;int M = 3;int K = 5;解决方案:采用暴力递归加动态规划的思想1、暴力递归:核心代码如下public class NanDaoKillMonster { public static void main(String[] ar原创 2021-07-16 12:51:50 · 793 阅读 · 0 评论 -
在N * M的区域上,李四初始在(row,col)位置,他一共要迈出k步,且每步都会等概率向上下左右四个方向走一个单位,期间李四只要离开N*M的区域,直接死亡,走k步之后,李四还在N * M区域的概率
问题描述:给出5个参数,N,M,row,col,k,表示在N * M的区域上,李四初始在(row,col)位置,他一共要迈出k步,且每步都会等概率向上下左右四个方向走一个单位,任何时候李四只要离开N*M的区域,就直接死亡,走了k步之后,李四还在N * M区域的概率,即李四活着的概率。解决方案:暴力递归和动态规划的解决方案1、暴力递归:1.1、图示分析:6*6的格子,在(3,3)位置,向四个方向移动5次,不越界的概率1.2、核心代码:public class NanDaoLiS.原创 2021-07-12 13:20:10 · 337 阅读 · 0 评论 -
给定一个货币数组arr,其中的值都是正数,再给定一个正数sum,每个值都认为是一张货币,即使是相同的货币也认为是不同的值,求返回sum的方法数
问题描述:给定一个货币数组arr,其中的值都是正数,再给定一个正数sum,每个值都认为是一张货币,即使是相同的货币也认为是不同的值,求返回sum的方法数。例如:arr = {1,2,2},sum = 3;此处就有两种方法,返回2。...原创 2021-07-11 19:20:12 · 259 阅读 · 0 评论 -
给出面值数组arr,其中的值都是正数且无重复。每个值都认为是一种面值,并且张数是无限的,现给出正数aim,求返回组成aim的方法数。
问题描述:给出面值数组arr,其中的值都是正数且无重复。每个值都认为是一种面值,并且张数是无限的,现给出正数aim,求返回组成aim的方法数。例如:arr = {1,2},aim = 4组成方法如下:1+1+1+1、1+1+2、2+2,一个三种方法,因此返回 3...原创 2021-07-09 15:19:05 · 416 阅读 · 0 评论 -
给出货币数组arr,均为正数,每个值都认为是一张货币,认为值相同的货币都相同,现给出一个正数aim,返回组成aim的方法数
问题描述:给出货币数组arr,均为正数,每个值都认为是一张货币,认为值相同的货币都相同,现给出一个正数aim,返回组成aim的方法数。例如:arr = {1,2,1,1,2,1,2},aim = 4方法:1+1+1+1、1+1+2、2+2一共三种方法,因此返回3。解决方案:此处我们采用暴力递归和动态规划两种思路解决问题。1、暴力递归:从左往右的尝试思想1.1、核心代码如下:/** * @author wanghuainan * @date 2021/7/6 16:32 .原创 2021-07-07 13:40:02 · 248 阅读 · 0 评论 -
给出一个二维数组,一个人从左上角出发,最终到达右下角,沿途数字累积,求返回最小的累加和
问题描述:给出一个二维数组arr,一个人从左上角出发,沿途只能向下或向左走,并且沿途的数数字都累加,最终到达右下角,求返回最小的累加和举例:给出一个数组 int[][] arr = new int[][]{{3, 7,8,7}, {1, 2,6,4},{10,3,8,9},{8,1,2,0}};需求是返回 12解决思想:动态规划的解决方案,此处提供两个方案,一种是常规方案,另一种是节约内存的方案。1、常规方案:1.1、分析图如下:人从左上角3的位置开始移动,每次只能向左或向..原创 2021-07-05 15:00:05 · 756 阅读 · 2 评论 -
一台咖啡机arr[i],N个人等待泡咖啡,咖啡机洗杯子耗时a,自己挥发耗时b,返回从开始等到所有咖啡杯变干净的最短时间
问题描述:给出一个数组arr,arr[i]代表第i号咖啡机泡一杯咖啡的时间;整数N,表示N个人等着咖啡机,每台咖啡机只能轮流泡咖啡,假如只有一台咖啡机,一次只能洗一个杯子,时间耗费a,洗完才能洗下一杯;每个咖啡杯也可以自己挥发干净,耗时b,咖啡杯可以并行挥发,假如所有人拿到咖啡之后立刻喝完,则返回从开始等到所有咖啡杯变干净的最短时间;四个参数为:int[] arr,int N,int a ,int b解决方案:...原创 2021-07-05 09:30:03 · 588 阅读 · 0 评论 -
象棋中“马”从某个位置(0,0)出发,经过K步,落在(x,y)上,有多少种方法
描述:假设把整个棋盘放入第一象限,棋盘的最左下角是(0,0)位置,整个棋盘就是横坐标上9条线,纵坐标上10条线的区域,给出三个参数x,y,k;返回“马”从(0,0)位置出发,必须走K步,最终落在(x,y)上的方法数有多少种?比如:K = 10;x = 7;y = 7 ,返回多少种方法?解决方案:暴力递归和动态规划的思路去解决问题1、暴力递归1.1、图示分析:马在一个位置可以有八种选择,总之,加到一起就可以了。1.2核心代码分析:public class NanDaoHo.原创 2021-06-29 17:08:02 · 816 阅读 · 0 评论 -
给出一个字符串str,返回这个字符串的最长回文子序列长度
问题描述:给出一个字符串str,返回这个字符串的最长回文子序列长度;比如:str = "a123b321c"最长回文子序列是123b321,返回长度是71、从上到下,从左到右,每个格子里的值就是需要返回的值,因此取最大值返回即可。2、从尝试该动态规划,只需要把位置找对就行。...原创 2021-06-29 12:17:03 · 979 阅读 · 0 评论 -
整型数组array,代表数值不同的纸牌排成一条线,玩家a和b依次拿走每张,规定a先拿,b后拿;每次只能拿最左或最右的,返回胜者的分数
问题描述:整型数组array,代表数值不同的纸牌排成一条线,玩家a和b依次拿走每张,规定a先拿,b后拿;每次只能拿最左或最右的,a和b都很聪明,请返回胜者的分数。原创 2021-06-26 17:24:42 · 611 阅读 · 0 评论 -
一行中N个位置,机器人在M位置上,走K步,来到P位置--java实现
详细描述:假设有排成一行的N个位置,记为1-N,N一定大于或者等于2,开始时机器人在其中的M位置上(M一定是1-N中的一个);如果机器人来到1位置,那么下一步只能往右到2位置;如果在N位置,下一步只能到N-1位置;如果在中间位置,下一步可以往左或右;规定机器人必须走K步,最终来到P位置(P在1-N之间);给定四个参数N、M、K、P,返回方法数。解决方案的思想:尝试入手:动态规划,重复操作都过滤掉,只留一次!即暴力递归到动态规划的演变!动态规划就是加缓存吗?不全对!原创 2021-06-24 19:41:02 · 538 阅读 · 2 评论 -
逆序输出一个栈--java实现
给出一个栈,需要逆序输出,即把此栈反过来,可以不加限制条件,这种情况下有多种实现实现思路;也可以加一些限制条件,比如不能申请额外的内存空间,只允许使用递归函数实现等等,当然限制条件越多,实现的思路越少。这里我们分享两种实现方案:1、不加限制条件:用个list集合做介质,核心代码如下import java.util.ArrayList;import java.util.List;import java.util.Stack;/** * @author wanghuainan * @dat原创 2021-06-23 13:42:19 · 2151 阅读 · 0 评论 -
输出字符串的全部排列--java实现
今天和大家分享一道算法题,输出字符串的全部排列;比如传ab字符串,打印结果应该为:ab、ba实现思想:采用递归加动态规划的思路,加上恢复现场的原理,同时解决。这里提供两个解决方案和一个去重的解决方案,供大家参考!1、删除元素的方案,核心代码如下:import java.util.ArrayList;import java.util.List;/** * @author wanghuainan * @date 2021/6/22 11:22 */public class ...原创 2021-06-22 20:34:42 · 966 阅读 · 1 评论 -
输出一个字符串的全部子序列--java
描述:依次打印输出一个字符串的全部子序列, 包括空字符串比如:"abc"输出结果:cbbcaacababc原创 2021-06-15 16:31:54 · 3799 阅读 · 1 评论 -
汉诺塔算法的两种实现思路
题目:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。汉诺塔的总步数为2^n-1...原创 2021-06-15 14:24:33 · 2385 阅读 · 0 评论 -
java语言--二叉搜索树的第k个结点
题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8)中,按结点数值大小顺序第三小结点的值为4。题目给出的是该二叉树的层序遍历结果。实际如图原创 2021-06-12 14:20:22 · 1305 阅读 · 1 评论 -
java语言--矩阵中的路径之算法实现
题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。...原创 2021-06-12 13:02:05 · 448 阅读 · 0 评论 -
java 实现滑动窗口的最大值算法
描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6原创 2021-06-12 11:13:18 · 1605 阅读 · 2 评论 -
二分查找的常规实现及自定义实现
1、对应自增的数组,从中查到最大的值或者下表,我们通常可以采取二分查找的算法,时间复杂度为logn。2、对应部分自增的原创 2021-06-04 11:29:13 · 166 阅读 · 0 评论 -
java语言堆排序(Heap Sort)详解
①、基本思想:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。②、算法描述:将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前原创 2021-05-31 15:20:01 · 946 阅读 · 0 评论 -
B+树原理分析及Java代码实现
今天我们分析B+树原理及Java代码实现,以前我写过一篇关于mysql 存储引擎B+Tree、 B-Tree和hash三种原理及区别,可以先参考参考参阅原创 2021-04-16 20:44:12 · 4823 阅读 · 8 评论 -
JDK1.8 HashMap源码之删除数据时 remove 系列方法分析(六)
今天我们分析查询的源码:原创 2021-04-14 14:31:57 · 575 阅读 · 0 评论 -
JDK1.8 HashMap源码之 查询数据时 get(Object key)系列方法分析(五)
今天开始分析HashMap源码查询数据时 get(Object key)系列方法,其他方法源码可以参考前几篇文章。get方法是最常用的方法之一,直接进入主题:1、查询的入口 get(Object key)/** * 获取key对应的值,如果找不到则返回null * 但是如果返回null并不意味着就没有找到,也可能key对应的值就是null,因为HashMap允许null值(也允许null键) * 在返回值为null时,可以通过containsKey来方法来区分到底是因为key不存在,还.原创 2021-04-14 18:49:09 · 287 阅读 · 0 评论 -
JDK1.8 HashMap源码之添加数据时putVal函数中处理红黑树的putTreeVal系列方法分析(四)
今天分析往红黑树中添加数据时的方法,分析之前先需要先预习:参考文档,和预先参考。一、首先简要分析一下 putVal 函数,调用此方法的地方都多处,我们列举一下:1、初始化有集合参数的构造函数中 putMapEntries 方法里会调用到此方法,核心代码如下:for (Map.Entry<? extends K, ? extends V> e : m.entrySet()) { K key = e.getKey(); V value = e.getValue();.原创 2021-04-14 14:25:33 · 254 阅读 · 0 评论 -
JDK1.8 HashMap源码之扩容时处理红黑树的split、 treeify系列方法分析(三)
上一篇分析了hashMap 扩容原理,预先参考,今天接着分析其中的split方法。首先这个方法只在HashMap进行扩容时会调用到: ((TreeNode<K,V>)e).split(this, newTab, j, oldCap);参数详解:/** 这个方法在HashMap进行扩容时会调用到: ((TreeNode<K,V>)e).split(this, newTab, j, oldCap); * @param map 代表要扩容的HashMap * @para原创 2021-04-13 21:22:21 · 794 阅读 · 0 评论 -
JDK1.8HashMap扩容机制之resize()方法详解(二)
上一篇我们分析了HashMap源码的成员变量和多种构造函数:前期参考。今天我们接着分析扩容机制相关的 resize() 方法。一、首先我们明确一下,源码中有多个地方入口调用此方法:1、有集合参数初始化构造方法走到 putVal 方法时会调用到2、调用 put 方法添加元素走到putVal方法 时会调用此方法3、链表转红黑树的 treeifyBin 方法会调用4、键不存在时才存入数据的 computeIfAbsent 方法里会调用此方法 ,方法使用参考5、存入数据的 compute 方原创 2021-04-13 20:54:03 · 607 阅读 · 0 评论 -
java 语言分析二叉树的前、中、后序遍历三种遍历方式
前几篇文章我们分析了几种二叉树的原理和实现,今天我们分析其遍历方式,前序遍历、中序遍历、后续遍历;我们以普通的二叉树为例;1、实现二叉树的代码:public class TestTwoTree { //定义Node节点 public static class Node{ int data; Node leftChild; Node rightChild; int height; public Node.原创 2021-04-09 20:14:32 · 542 阅读 · 0 评论 -
JDK1.8HashMap源码之成员变量和多种构造函数分析(一)
今天我们进行HashMap源码开始分析,它是集数组、链表、红黑树的优点于一身的常用数据结构。废话少说,直奔主题。1、类继承关系:public class HashMap<K,V> extends AbstractMap<K,V> i mplements Map<K,V>, Cloneable, Serializable如图:2、成员变量:private static final long serialVersionUID = ..原创 2021-04-08 21:18:07 · 247 阅读 · 0 评论 -
红黑树的原理及实现
今天分享平衡二叉树的原理及实现:红黑树的简介:1、红黑树(R-B Tree,Red-Black Tree)它一种特殊的二叉查找树,同时具备以下特征:1)节点非红即黑2)根节点是黑色3)所有NUll节点称为叶子节点,且认为颜色为黑4)所有红色节点的子节点都为黑色5)从任一节点到其叶子节点的所有路径上都包含相同数目的黑节点以上五点特征共同保证:从根到叶子的最长的路径不多于最短的可能路径的两倍长。2、红黑树的插入操作:红黑树性质1:根节点是黑色红黑树性质5:从任一节原创 2021-04-03 23:42:05 · 1737 阅读 · 0 评论 -
平衡二叉树的原理及实现
今天分析平衡二叉树的原理及实现:详解平衡二叉树之前先大致普及一下二叉树的基础。一、二叉树1、定义1)结点的度:结点的子树个数2)树的度:树中所有结点中最大的度3)结点的层次:规定根结点在1层,子结点的层数是它父结点的层数加14)树的高度:树中所有结点中最大的层次是这棵树的高度度为2的树(树中所有结点中最大的度) ,子树有左右顺序之分 2、二叉排序树二叉排序树(BST,Binary Sort Tree) 也称二叉查找树(Binary Search Tree),或二..原创 2021-04-03 22:54:24 · 2542 阅读 · 1 评论 -
数据结构中树与二叉树原理解析
今天我们分析数据结构中树与二叉树原理:这是数据结构中各种树的基础。1、树的定义树(Tree):N个结点构成的有限集合。 树中有一个称为”根(Root)”的特殊结点 其余结点可分为若干个互不相交的树,称为原来结点的”子树”,如同:其中A为根节点,最下面一层为子节点。2、树的常用基本术语1)结点的度:结点的子树个数2)树的度:树中所有结点中最大的度3)叶结点:度为0的结点,即没有子节点的节点(最后一层节点)。4)父结点:有子树的结点是其子树的根结点的父结点5)子结点:若A原创 2021-04-03 12:09:02 · 728 阅读 · 0 评论 -
哈夫曼树的编码原理及实战分析
今天我们分享哈夫曼树的编码原理及实战:首先我们通过一道面试题来引出哈夫曼树,试题如下:问题:给定一段字符串,如何对字符串进行编码,可以使得该字符串的编码存储空间最少?【例子】假设一段文本,包含58个字符,并且由以下7个字符构成:a,b,c,d,e,f,g;这7个字符出现的频次不同,如何对这7个字符进行编码,使得总编码空间最小。 字符 a b c d e f原创 2021-04-03 13:53:26 · 2042 阅读 · 0 评论
分享