尚硅谷Java数据结构与算法第三章——稀疏数组和队列

硅谷Java数据结构java算法 全194章笔记整理 前言 视频地址:https://www.bilibili.com/video/BV1E4411H73v?from=search&seid=13120683720695451628 评价:整个教程的数据结构部分讲的挺好的,知识点全都覆盖了,而且每个数据结构都有代码解释,但是最后20节算法部分讲的有点乱,算法部分我决定直接刷leetcode了 数组 稀疏数组: 二维数组的省内存的保存方法,一般是n行3列,三列分别为行,列,值。 二维数组稀疏数组: 遍历整个二维数组,查看有多少个有效数字 根据有效数字 阅读详情

第 3 章 稀疏数组和队列

3.1 稀疏 sparsearray 数组

3.1.1 实际需求

编写的五子棋程序中,有存盘退出和续上盘的功能。
五子棋程序
分析问题:
因为该二维数组的很多值是默认值 0, 因此记录了很多没有意义的数据 -> 稀疏数组

3.1.2 基本介绍

  • 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。

  • 稀疏数组的处理方法是:
    ① 记录数组一共有几行几列,有多少个不同的值
    ② 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模
    在这里插入图片描述
    稀疏数组的第一行[0]保存原始数组共有几行几列以及共有几个位置上有值,下边的各行分别表示存有值的数据在几行几列以及具体的值。
    对于上述例子,通过转换,我们将一个6*7的数组转换成了3*9的数组。

3.1.3 应用实例

  • 使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)

  • 把稀疏数组存盘,并且可以从新恢复原来的二维数组数

  • 整体思路分析
    稀疏数组思路分析

    1. 二维数组转稀疏数组的思路
      ① 遍历原始的二维数组,得到有效数据的个数 sum
      ② 根据sum 就可以创建 稀疏数组 sparseArr int[sum + 1] [3]
      sum+1的原因是需要第一行来存数组的相关信息
      ③ 将二维数组的有效数据数据存入到稀疏数组
    2. 稀疏数组转原始的二维数组的思路
      ① 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的 chessArr2 = int [11][11]
      ② 在读取稀疏数组后几行的数据,并赋给 原始的二维数组即可
  • 代码实现

    package com.atguigu.sparsearray;
    
    public class SparseArray {
    	public static void main(String[] args) {
    		
    		// 创建一个原始的二维数组 11 * 11
    		// 0: 表示没有棋子, 1 表示 黑子 2 表蓝子
    		int chessArr1[][] = new int[11][11];
    		chessArr1[1][2] = 1;
    		chessArr1[2][3] = 2;
    		chessArr1[4][5] = 2;
    		// 输出原始的二维数组
    		System.out.println("原始的二维数组为:");
    		for (int[] row : chessArr1) {
    			for (int data : row) {
    				System.out.print(data + "\t");
    			}
    			System.out.println();
    		}
    		
    		
    		// 将二维数组 转 稀疏数组的思路
    		// 1. 遍历原始二维数组,得到非0的数据的个数
    		int sum = 0;
    		for (int i = 0; i < 11; i++) {
    			for (int j = 0; j < 11; j++) {
    				if (chessArr1[i][j] != 0) {
    					sum++;
    				}
    			}
    		}
    		// 2. 创建对应的稀疏数组
    		// 数组初始化
    		int sparseArr[][] = new int[sum + 1][3];
    		// 数组元素赋值-第一行
    		sparseArr[0][0] = 11;
    		sparseArr[0][1] = 11;
    		sparseArr[0][2] = sum;
    		// 数组元素赋值-遍历二维数组,将非0的值存放到 sparseArr中
    		int count = 1;
    		for (int i = 0; i < 11; i++) {
    			for (int j = 0; j < 11; j++) {
    				if (chessArr1[i][j] != 0) {
    					sparseArr[count][0] = i;
    					sparseArr[count][1] = j;
    					sparseArr[count][2] = chessArr1[i][j];
    					count++;
    				}
    			}
    		}
    		
    		// 输出转换完成的稀疏数组
    		System.out.println();
    		System.out.println("转换完成的稀疏数组为:");
    		for(int i = 0; i < sparseArr.length; i++) {
    			System.out.println(sparseArr[i][0] + "\t" + sparseArr[i][1] + "\t" + sparseArr[i][2]);
    		}
    		
    		
    		// 将稀疏数组 转回 二维数组的思路
    		// 1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
    		int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
    		// 2.再读取稀疏数组后几行的数据(从第二行开始),并赋给 原始的二维数组 即可
    		for(int i = 1;i < sparseArr.length;i++) {
    			chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
    		}
    		
    		// 输出恢复后的二维数组
    		System.out.println();
    		System.out.println("恢复后的二维数组为:");
    		for(int[] row : chessArr2) {
    			for(int data : row) {
    				System.out.print(data + "\t");
    			}
    			System.out.println();
    		}
    		
    	}
    }
    

3.2 队列

3.2.1 使用场景

银行排队的案例:按照顺序叫号
银行排队

3.2.2 队列介绍

  • 队列是一个有序列表,可以用数组或是链表来实现。
  • 遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出
  • 示意图:(使用数组模拟队列示意图)
    数组模拟队列示意图

3.2.3 数组模拟队列

  • 队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队列的最大容量。
  • 因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 frontrear分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear则是随着数据输入而改变,如图所示:
    数组模拟队列
  • 当我们将数据存入队列时称为”addQueue”,addQueue 的处理需要有两个步骤:思路分析
    1. 初始化:
      ① 创建两个指针frontrear分别记录队列前后端的下标,两个指针都初始化为 -1front指向队列第一个元素的前一个位置rear指向最后一个元素本身位置
      ② 声明属性maxSize 记录该队列的最大容量
      ③ 声明属性arr数组用于存放数据,模拟队列
    2. 添加时:
      ① 判断数组是否已满(rear == maxSize-1)
      ② 未满时,尾指针rear后移,并将数据存入rear所指的元素位置
    3. 取出时:
      ① 判断数组是否为空(front == rear)
      ② 不为空时,头指针front后移,并将现在front所指位置的元素返回,此时front指向的仍为队列首元素的前一个位置
  • 代码实现
    package com.atguigu.queue;
    
    import java.util.Scanner;
    
    public class ArrayQueueDemo {
    	public static void main(String[] args) {
    		//测试
    		ArrayQueue queue = new ArrayQueue(3);
    		char key;//接收用户输入
    		Scanner scan = new Scanner(System.in);
    		boolean isFlag = true;
    		while(isFlag) {
    			System.out.println("s(show): 显示队列");
    			System.out.println("a(add): 添加数据到队列");
    			System.out.println("g(get): 从队列取出数据");
    			System.out.println("h(head): 查看队列头的数据");
    			System.out.println("e(exit): 退出程序");
    			key = scan.next().charAt(0);
    			switch (key) {
    			case 's': 
    				queue.showQueue();
    				break;
    			case 'a':
    				System.out.println("输入一个数:");
    				int value = scan.nextInt();
    				queue.addQueue(value);
    				break;
    			case 'g':
    				try {
    					int data = queue.getQueue();
    					System.out.println("取出的数据是:" + data);
    				} catch (Exception e) {
    					// TODO: handle exception
    					System.out.println(e.getMessage());
    				}
    				break;
    			case 'h': //查看队列头的数据
    				try {
    					int head = queue.headQueue();
    					System.out.println("队列头的数据是:" + head);
    				} catch (Exception e) {
    					// TODO: handle exception
    					System.out.println(e.getMessage());
    				}
    				break;
    			case 'e':
    				scan.close();
    				isFlag = false;
    				break;
    			default:
    				break;
    			}
    		}
    		
    		System.out.println("程序退出~");
    		
    	}
    }
    
    //使用数组模拟队列-编写一个ArrayQueue类
    class ArrayQueue {
    	private int maxSize; // 数组的最大容量
    	private int front; // 队列头
    	private int rear; // 队列尾
    	private int[] arr; // 该数组用于存放数据,模拟队列
    
    	// 创建队列的构造器
    	public ArrayQueue(int arrMixSize) {
    		maxSize = arrMixSize;
    		arr = new int[maxSize];
    		front = -1;
    		rear = -1;
    	}
    
    	// 判断队列是否为空
    	public boolean isEmpty() {
    		return front == rear;
    	}
    
    	// 判断队列是否已满
    	public boolean isFull() {
    		return rear == maxSize - 1;
    	}
    
    	// 添加数据到队列
    	public void addQueue(int n) {
    		// 判断数据是否已满
    		if (isFull()) {
    			System.out.println("队列已满,不能再加入数据!");
    			return;
    		}
    		rear++;// rear指针后移
    		arr[rear] = n;
    	}
    
    	// 获取队列的数据, 出队列
    	public int getQueue() {
    		// 判断队列是否为空
    		if (isEmpty()) {
    			throw new RuntimeException("队列为空,不能获取数据!");
    		}
    		front++;// front指针后移
    		return arr[front];
    	}
    
    	// 显示队列的所有数据
    	public void showQueue() {
    		// 遍历
    		if (isEmpty()) {
    			System.out.println("队列为空,没有数据!");
    			return;
    		}
    		for (int i = 0; i < arr.length; i++) {
    			System.out.printf("arr[%d]=%d\n", i, arr[i]);
    		}
    	}
    
    	// 显示队列的头数据, 注意不是取出数据
    	public int headQueue() {
    		// 判断队列是否为空
    		if (isEmpty()) {
    			throw new RuntimeException("队列为空,不能获取数据!");
    		}
    		return arr[front + 1];
    	}
    }
    
  • 问题分析并优化
    ① 目前数组使用一次就不能用, 没有达到复用的效果
    (取出数据时只是将指针后移,并没有释放数组队列中存放已取出数据的位置的空间,尾指针也只是从数组队列的头到尾后停止,一次性使用,会导致假溢出问题)
    ② 将这个数组使用算法,改进成一个环形的队列 取模:%

3.2.4 数组模拟环形队列

  • 解决假溢出的办法就是后面满了,就再从头开始,也就是头尾相接的循环。我们把队列的这种头尾相接的顺序存储结构称为循环队列。
    对前面的数组模拟队列的优化,充分利用数组。与普通队列不同,环形队列可以使得资源进行重复利用。

  • 思路分析:
    此时,首先,对于环形队列,指针需要在环形内部运动,因此初始值不能再设为-1,应当改为0。front也不应该再指向为第一个元素的上一个元素,而是元素本身位置。为保证当只有一个元素时,首尾指针的指向不同,rear不应当再指向最后一个元素,而是指向最后一个元素的下一个位置。当环形队列为空或者为满时,示意图如下:
    在这里插入图片描述
    此时存在问题:两种情况下都为首尾指针重合,无法进行区分
    因此我们在实现时需要预留一个约定空间来进行空队列和满队列的区分,尾指针指向此空间,如下图:
    情况1:
    在这里插入图片描述
    情况2:
    在这里插入图片描述
    此时,队列的数据容量比初始化的空间损失1,但可以完成空队列和满队列的区分。
    空队列时:front == rear —— 每次元素出队列时首指针会后移,两指针重合时为空
    满队列时:(rear + 1) % maxSize = front —— 尾指针的下一个为首指针时为满
    队列实际容量:(rear - front + maxSize) % maxSize
    队列实际容量分析

    1. 初始化:
      ① 创建两个指针frontrear分别记录队列前后端的下标,两个指针都初始化为 0front指向队列第一个元素的位置rear指向最后一个元素后一个位置
      ② 声明属性maxSize 记录该队列的最大容量
      ③ 声明属性arr数组用于存放数据,模拟队列
    2. 添加时:
      ① 判断数组是否已满(rear == maxSize-1)
      ② 未满时,尾指针rear后移,并将数据存入rear所指的元素位置
    3. 取出时:
      ① 判断数组是否为空(front == rear)
      ② 不为空时,头指针front后移,并将现在front
  • 代码实现

    package com.atguigu.queue;
    
    import java.util.Scanner;
    
    public class CircleArrayQueueDemo {
    	public static void main(String[] args) {
    		// 测试
    		CircleArray queue = new CircleArray(4);//此时,环形数列最大存储容量为3
    		char key;// 接收用户输入
    		Scanner scan = new Scanner(System.in);
    		boolean isFlag = true;
    		while (isFlag) {
    			System.out.println("s(show): 显示队列");
    			System.out.println("a(add): 添加数据到队列");
    			System.out.println("g(get): 从队列取出数据");
    			System.out.println("h(head): 查看队列头的数据");
    			System.out.println("e(exit): 退出程序");
    			key = scan.next().charAt(0);
    			switch (key) {
    			case 's':
    				queue.showQueue();
    				break;
    			case 'a':
    				System.out.println("输入一个数:");
    				int value = scan.nextInt();
    				queue.addQueue(value);
    				break;
    			case 'g':
    				try {
    					int data = queue.getQueue();
    					System.out.println("取出的数据是:" + data);
    				} catch (Exception e) {
    					// TODO: handle exception
    					System.out.println(e.getMessage());
    				}
    				break;
    			case 'h': // 查看队列头的数据
    				try {
    					int head = queue.headQueue();
    					System.out.println("队列头的数据是:" + head);
    				} catch (Exception e) {
    					// TODO: handle exception
    					System.out.println(e.getMessage());
    				}
    				break;
    			case 'e':
    				scan.close();
    				isFlag = false;
    				break;
    			default:
    				break;
    			}
    		}
    
    		System.out.println("程序退出~");
    
    	}
    }
    
    class CircleArray {
    	private int maxSize; // 数组的最大容量
    	private int front; // 队列头,含义做一个调整: front 就指向队列的第一个元素, 也就是说 arr[front] 就是队列的第一个元素
    	private int rear; // 队列尾,含义做一个调整:rear 指向队列的最后一个元素的后一个位置. 因为希望空出一个空间做为约定.
    	private int[] arr; // 该数组用于存放数据,模拟队列
    
    	// 创建队列的构造器
    	public CircleArray(int arrMixSize) {
    		maxSize = arrMixSize;
    		arr = new int[maxSize];
    	}
    
    	// 判断队列是否为空
    	public boolean isEmpty() {
    		return front == rear;
    	}
    
    	// 判断队列是否已满
    	public boolean isFull() {
    		return (rear + 1) % maxSize == front;
    	}
    
    	// 添加数据到队列
    	public void addQueue(int n) {
    		// 判断数据是否已满
    		if (isFull()) {
    			System.out.println("队列已满,不能再加入数据!");
    			return;
    		}
    		// rear指向队尾的下一个位置,因此直接加入元素即可
    		arr[rear] = n;
    		// rear指针后移,这里必须考虑取模
    		rear = (rear + 1) % maxSize;
    	}
    
    	// 获取队列的数据, 出队列
    	public int getQueue() {
    		// 判断队列是否为空
    		if (isEmpty()) {
    			throw new RuntimeException("队列为空,不能获取数据!");
    		}
    		// front指向的即为需要返回的元素(队列的第一个元素)
    		// 但如果直接返回,会导致无法再对front指针进行后移操作
    		// 1. 保存当前front指向的值到临时变量
    		int value = arr[front];
    		// 2. front指针后移,这里必须考虑取模
    		front = (front + 1) % maxSize;
    		// 3. 返回临时变量保存的值
    		return value;
    	}
    
    	// 显示队列的所有数据
    	public void showQueue() {
    		// 遍历
    		if (isEmpty()) {
    			System.out.println("队列为空,没有数据!");
    			return;
    		}
    		// 遍历从front开始,共遍历实际存储的数据容量次
    		for (int i = front; i < front + size(); i++) {
    			System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize]);
    		}
    	}
    
    	// 求出当前队列有效数据的个数(实际存储的数据容量)
    	public int size() {
    		return (rear + maxSize - front) % maxSize;
    	}
    
    	// 显示队列的头数据, 注意不是取出数据
    	public int headQueue() {
    		// 判断队列是否为空
    		if (isEmpty()) {
    			throw new RuntimeException("队列为空,不能获取数据!");
    		}
    		return arr[front];
    	}
    
    }
    

    输出结果

数据结构算法-01 数组、链表 本文介绍了数据结构算法的重要性及其经典应用案例。文章首先通过字符串匹配、汉诺塔、八皇后、马踏棋盘等经典算法问题,展示了KMP算法、分治算法、回溯算法DFS等算法的实际应用。其次阐述了数据结构算法的关系,强调算法是程序的灵魂,并通过五子棋存档、约瑟夫问题等示例说明数据结构在实际编程中的作用。最后详细讲解了稀疏数组的原理实现,通过代码演示了二维数组稀疏数组的相互转换过程。全文以实际问题为导向,展现了数据结构算法在提高程序效率解决复杂问题中的关键作用。 阅读详情

相关推荐

端侧部署优化:让 AI 真正走进现实生活的关键技术

AI 的开发流程分为 “训练” “推理” 两大阶段。在训练阶段,科研人员依托云端海量数据高性能 GPU 算力,构建出精度优异的 AI 模型 —— 比如能识别 1000 种物体的图像分类模型、能理解人类语言的自然语言处理模型。但这些在云端 “战绩斐然” 的模型,若直接应用到现实场景中,却会面临三大 “落地困境”。从云端到端侧,从模型压缩到硬件适配,端侧部署优化技术解决了 AI 落地的核心难题,让 AI 不再是实验室里的 “高精尖技术”,而是融入日常生活的 “实用工具”。

m0_63477749的博客 1023

新星计划Day4【数据结构算法稀疏数组队列

新星计划Day4【数据结构算法稀疏数组队列 👩‍💻博客主页:京旧铺的博客主页 ✨欢迎关注🖱点赞🎀收藏⭐留言✒ 🔮本文由京旧铺原创,csdn首发! 😘系列专栏:java学习 💻首发时间:🎞2022年4月28日🎠 🎨你做三四月的事,八九月就会有答案,一起加油吧 🀄如果觉得博主的文章还不错的话,请三连支持一下博主哦 🎧最后的话,作者是一个新人,在很多方面还做的不好,欢迎大佬指正,一起学习哦,冲冲冲 🛒导航小助手🎪 文章目录新星计划Day4【数据结构算法稀疏数组队列在这里插入图片描述🛒导

qq_46272491的博客 2288

【数据集7】全球人类住区层GHSL数据详解

全球人类住区层GHSL数据详解

WW、forever的博客 2220

稀疏数组的实现(硅谷Java数据结构算法)

整个代码放在main函数中就可以运行 从数组---->稀疏数组 int arrays[][] = new int[11][11]; arrays[1][2] = 1; arrays[2][3] = 2; //打印初始化的数组 for (int i = 0;i<arrays.length;i++){ for (int j = 0;j<arrays[i].length;j++){

ALi的博客 170

硅谷Java数据结构算法稀疏数组

1. 实际需求 编写的五子棋程序中,有存盘退出续上盘的功能。 分析问题: 因为该二维数组的很多值是默认值 0, 因此记录了 很多没有意义的数据。 这个时候就可以使用稀疏数组来压缩二维数组。 2. 基本介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组稀疏数组的处理方法是: 记录数组 一共有几行几列,有多少个有效值 把具有不同值的元素的行、列及值记录在一个小规模的数组中,从而缩小程序的规模 示例:二维数组对应的稀疏数组 3. 应用实例 分析 使用稀疏数组

Ep流苏的博客 502

1.2.java数据结构算法——第三章,第四章(稀疏数组队列;链表)--师承硅谷,韩顺平

数据结构

Kevinwen0228的博客 550

硅谷【韩顺平】 | Java数据结构算法【详细笔记】(持续更新)

这里写目录标题数据结构线性结构非线性结构线性结构非线性结构稀疏 sparsearray 数组 队列稀疏 sparsearray 数组基本介绍应用实例代码的实现队列数组模拟队列思路实现代码问题分析并优化数组模拟环形队列实现代码链表链表介绍单链表的应用:第一步:在添加英雄时,直接添加到链表的尾部第二步:根据排名插入到指定位置第三步:修改节点第四步:删除节点面试题求单链表中有效节点的个数求单链表的倒数第K个节点反转链表打印逆序列表合并两个有序链表实现全部代码双向链表管理单向链表的缺点分析:双向链表的操作分析单

小七自学博客 1万+

硅谷 java数据结构算法 学习笔记(一)

这里写目录标题线性结构 非线性结构稀疏数组SparseArray需求介绍实例代码实现代码执行结果队列介绍数组模拟队列思路代码实现问题数组模拟环形队列环形队列代码实现 线性结构 非线性结构 稀疏数组SparseArray 需求 记录棋盘的位置 可用用二位数组将它保存 ,但是会发现记录很多没有意义的数据很多空间浪费 可以用稀疏数组进行优化 介绍 稀疏数组就是压缩缩多余的冗余数据 第一行的记录原表的行列数 非0值的个数 实例 代码实现 package com.luyi.DataStructure

weixin_43691773的博客 6029

硅谷数据结构算法——稀疏数组

跟着B站的硅谷学习数据结构算法,语言为java,目前是第一个代码内容——稀疏数组硅谷——稀疏数组提示:以下是本篇文章正文内容,下面案例可供参考当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组稀疏数组的处理方法:1)记录数组一共有多少行,有多少个不同的值2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。

weixin_54533016的博客 605

硅谷|韩顺平】数据结构算法

硅谷韩顺平老师所讲的数据结构算法进行笔记总结

ZEZHEN0222的博客 2636

硅谷_数据结构算法】二、稀疏数组队列

文章目录参考资料1. 稀疏数组1.1 介绍1.2 应用实例2. 队列2.1 简述2.2 数组模拟队列思路2.3 数组模拟环形队列 参考资料 https://www.bilibili.com/video/BV1E4411H73v?p=16&spm_id_from=pageDriver 1. 稀疏数组 问题引入 1.1 介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组稀疏数组的处理方法是: 首先,稀疏数组的首行记录原数组一共有几行几列,有多少个不同的值

weixin_42301220的博客 745

Java数据结构算法_01 稀疏数组队列

Java数据结构算法_01稀疏数组应用实例代码实现队列 本人是个新手,写下博客用于自我复习、自我总结。 如有错误之处,请各位大佬指出。 学习资料来源于:硅谷 数据结构包括:线性结构非线性结构。 线性结构: 1)线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系。 2)线性结构有两种不同的存储结构,即顺序存储结构链式存储结构,顺序存储的线性表称为顺序表,顺序表中的存储...

一个努力学习的程序猿 474

稀疏数组队列

一、稀疏 sparsearray数组 1.实际的需求 编写的五子棋程序中,有存盘退出续上盘的功能: 因为该二维数组的很多值是默认值 0,因此记录了很多没有意义的数据.->稀疏数组。 2.基本介绍 稀疏数组的处理方法是: 1)记录数组一共有几行几列,有多少个不同的值 2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模 3.应用实例 ...

心猿意碼 8699

笔记_硅谷Java数据结构java算法 韩顺平数据结构算法_Part3(稀疏数组&队列)

1

Jeankyw的博客 590

硅谷Java数据结构算法详细整理笔记(附代码)更新中…………

数据结构包括:线性结构非线性结构 线性结构有两种不同的存储结构,即顺序存储结构链式存储结构。顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息线性结构常见的有:数组队列、链表栈非线性结构包括:二维数组,多维数组,广义表,树结构,图结构 稀疏 sparsearray数组稀疏数组代码二维数组稀疏数组的思路队列是一个有序列表代码模拟队列

Blue 1734

Java数据结构算法 day01 稀疏数组队列

文章目录数据结构算法 --内容介绍数据结构算法内容介绍几个经典的算法面试题数据结构算法的重要性数据结构算法的介绍数据结构算法的关系✔ 实际编程中遇到的问题 数据结构算法 --内容介绍 数据结构算法内容介绍 几个经典的算法面试题 1)字符串匹配问题:: 有一个字符串 str1= ““硅硅谷 硅谷硅谷硅谷硅你好””,一个子串 str2=“硅谷硅你” 2)现在要判断 str1 是否含有 str2, 如果存在,就返回第一次出现的位置, 如果没有,则返回-1 3)要求用最快

Alu_em的博客 288

算法数据结构(b站硅谷韩老师教程学习笔记)

教程学习地址: https://www.bilibili.com/video/BV1E4411H73v 一、数据结构算法的关系 数据data结构(structure)是一门研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构可以编写出更加漂亮,更加有效率的代码。 要学习好数据结构就要多多考虑如何将生活中遇到的问题,用程序去实现解决. 程序 = 数据结构 + 算法 数据结构算法的基础, 换言之,想要学好算法,需要把数据结构学到位。 总结:数据结构是基石,研究数据方式;算法是是数据处理更

M1275601161的博客 3823

01-数据结构算法数组队列-(硅谷-韩)

数据结构算法学习

Kevin-Ding的博客 263

数据结构算法Java】01---稀疏数组队列

稀疏数组的实现,队列环形队列的演示

鹤鸣呦呦、、的博客 306

Java数据结构--稀疏数组队列

这里写目录标题前言初始Java数据结构线性结构非线性结构什么是稀疏数组稀疏数组实例队列改进前改进后(循环队列) 前言 这个月更新Java版本的数据结构 再次巩固下Java基础,多写一些优质的代码 文章参考硅谷Java数据结构 初始Java数据结构 程序=数据结构+算法 数据结构算法的基础,换言之,想要学好算法,需要把数据结构学到位。 线性结构 1)线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系 2)线性结构有两种不同的存储结构,即顺序存储结构(数组)链式存储结构(链表)。顺序

全网粉丝10W+、全栈领域优质创作者、掘金、阿里云等社区博客专家、专注于全栈领域和毕业项目实战 686

policy-templates Chrome组策略管理模板(admx)

policy_templates Chrome组策略管理模板(admx),下载此文件放入域控,可以通过域控策略管理客户端谷歌浏览器

上一篇: 尚硅谷Java入门视频教程第五章——面向对象编程(中)
下一篇: 尚硅谷Java入门视频教程第六章——面向对象编程(下)
荔枝小丸子
博客等级 码龄7年 16粉丝 · 23原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值