Java稀疏数组
目录
1.稀疏数组
2.稀疏数组的使用
2.1 二维数组转换为稀疏数组
2.2 稀疏数组转换为二维数组
1.稀疏数组
稀疏数组(Sparse Array):当一个数组中的大部分元素为相同的值,可使用稀疏数组来保存该数组,可以将稀疏数组看做是普通数组的压缩
例如

数组arr中许多值为0,若对二维数组直接进行存储,则会存储许多相同的数值0,造成空间的浪费,此时,我们可以用稀疏数组对其进行存储
2.稀疏数组的使用
要对二维数组进行存储,我们需要知道二维数组的行和列、不同数值的数量以及不同元素的位置和值
稀疏数组的第一行,存放二维数组arr的行数、列数、不同数值的数量sum
后面几行,存放不同值元素在二维数组arr中的行、列、数值

代码实现
创建二维数组
int[][] arr = new int[6][5];arr[1][0] = 1;arr[1][3] = 6;arr[4][3] = 2;
2.1 二维数组转换为稀疏数组
(1)遍历二维数组,确定不同元素的个数sum
int sum = 0;for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[0].length; j++) {if(arr[i][j] != 0){sum++;}}}
(2)根据sum创建稀疏数组
int[][] sparseArr = new int[sum+1][3];
(3) 遍历二维数组,对稀疏数组进行赋值
//稀疏数组的第一行分别存放二维数组的行数、列数以及不同元素的个数sparseArr[0][0] = arr.length;sparseArr[0][1] = arr[0].length;sparseArr[0][2] = sum;//再对不同元素进行存储int k = 0;for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[0].length; j++) {if(arr[i][j] != 0){k++;//分别存放不同元素的行、列以及数值sparseArr[k][0] = i;sparseArr[k][1] = j;sparseArr[k][2] = arr[i][j];}}}
2.2 稀疏数组转换为二维数组
(1)创建二维数组
int[][] arr1 = new int[sparseArr[0][0]][sparseArr[0][1]];
(2)遍历稀疏数组, 对不同值元素进行赋值
//遍历稀疏数组,对不同值元素进行赋值for (int i = 1; i < sparseArr.length; i++) {arr1[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];}
完整代码
public class Test {public static void main(String[] args) {//创建二维数组int[][] arr = new int[6][5];arr[1][0] = 1;arr[1][3] = 6;arr[4][3] = 2;System.out.println("****二维数组****");for (int[] row: arr) {for (int data: row) {System.out.printf("%d ",data);}System.out.println();}int sum = 0;for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[0].length; j++) {if(arr[i][j] != 0){sum++;}}}//创建稀疏数组int[][] sparseArr = new int[sum+1][3];//稀疏数组的第一行分别存放二维数组的行数、列数以及不同元素的个数sparseArr[0][0] = arr.length;sparseArr[0][1] = arr[0].length;sparseArr[0][2] = sum;//再对不同元素进行存储int k = 0;for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[0].length; j++) {if(arr[i][j] != 0){k++;//分别存放不同元素的行、列以及数值sparseArr[k][0] = i;sparseArr[k][1] = j;sparseArr[k][2] = arr[i][j];}}}System.out.println("****稀疏数组****");for (int[] row: sparseArr) {for (int data: row) {System.out.printf("%d ",data);}System.out.println();}//创建二维数组int[][] arr1 = new int[sparseArr[0][0]][sparseArr[0][1]];//遍历稀疏数组,对不同值元素进行赋值for (int i = 1; i < sparseArr.length; i++) {arr1[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];}System.out.println("****二维数组****");for (int[] row: arr1) {for (int data: row) {System.out.printf("%d ",data);}System.out.println();}}
}
运行结果

相关文章:
Java稀疏数组
目录 1.稀疏数组 2.稀疏数组的使用 2.1 二维数组转换为稀疏数组 2.2 稀疏数组转换为二维数组 1.稀疏数组 稀疏数组(Sparse Array):当一个数组中的大部分元素为相同的值,可使用稀疏数组来保存该数组,可以将稀疏数组…...
内存管理框架 --- 基础知识
文章目录 一、内存管理1.1 内存管理的出现1.2 内存管理的用途1.2.1 虚拟内存和物理内存的定义1.2.1.1 什么是虚拟内存? 1.2.2 虚拟内存的划分:用户空间与内核空间 1.3 操作系统和MMU1.3.1 OS和MMU的关系1.3.2 虚拟地址到物理地址的映射流程 1.4 物理内存…...
React + Next.js 搭建项目(配有对比介绍一起食用)
文章标题 01 Next.js 是什么02 Next.js 搭建工具 create-next-app03 create-react-app 与 create-next-app 的区别04 快速构建 Next.js 项目05 App Router 与 Pages Router 的区别 01 Next.js 是什么 Next.js 是一个 React 框架,它允许你使用 React 框架建立超强的…...
【Java】Java基础
环境准备 安装JDK和JRE 下载JDK,可以在官网Java Downloads | Oracle 中国下载,但是这里需要注册才能够下载。在Index of java-local/jdk (huaweicloud.com)也可以下载到,但是版本比较老,关系不大,直接下载࿰…...
Spring-SpringBoot-SpringMVC-MyBatis常见面试题
文章目录 Spring篇springbean是安全的的?什么是AOP你们工作中有用过AOP吗spring中的事务是如何实现的spring中事务失效场景Spring的生命周期spring中的循坏依赖springMVC的执行流程springboot的启动原理常用注解MyBatis执行流程Mybatis是否支持延迟加载?Mybatis的一…...
15.MyCat数据库分片
MyCat 是一个开源的数据库中间件,主要用于将数据库操作请求路由和分发到后端的多个数据库节点。 1.Mycat环境搭建 在两个不同数据库中创建相同表 下载mycat https://github.com/MyCATApache/Mycat-Serverhttps://github.com/MyCATApache/Mycat-Server 将下…...
【Python】PySpark
前言 Apache Spark是用于大规模数据(large-scala data)处理的统一(unified)分析引擎。 简单来说,Spark是一款分布式的计算框架,用于调度成百上千的服务器集群,计算TB、PB乃至EB级别的海量数据…...
pycharm 打开Terminal时报错activate.ps1,因为在此系统上禁止运行脚本,并因此无法进入虚拟环境
pycharm 打开Terminal时报错activate.ps1,因为在此系统上禁止运行脚本,并因此无法进入虚拟环境 如下图所示: 网上说可以set_restrictFalse什么的,虽然也可但可能会降低电脑安全性,可以将下面的终端改为cmd.exe即可...
[C++][C#]yolox TensorRT C++ C#部署
YOLOX是一种新型的高性能探测器,由开发者Zheng Ge、Songtao Liu、Feng Wang、Zeming Li和Jian Sun在《YOLOX: Exceeding YOLO Series in 2021》首次提出。与YOLOV5和YOLOV8相比,YOLOX具有更高的性能和更好的平衡,在速度和精度方面都表现出优越…...
根据源码,模拟实现 RabbitMQ - 网络通讯设计,自定义应用层协议,实现 BrokerServer (8)
目录 一、网络通讯协议设计 1.1、交互模型 1.2、自定义应用层协议 1.2.1、请求和响应格式约定 编辑 1.2.2、参数说明 1.2.3、具体例子 1.2.4、特殊栗子 1.3、实现 BrokerServer 1.3.1、属性和构造 1.3.2、启动 BrokerServer 1.3.3、停止 BrokerServer 1.3.4、处…...
MongoDB入门
简介 MongoDB是一个开源、高性能、支持海量数据存储的文档型数据库 是NoSQL数据库产品中的一种,是最像关系型数据库(MySQL)的非关系型数据库 内部采用BSON(二进制JSON)格式来存储数据,并支持水平扩展。 MongoDB本身并不是完全免费的,它对于…...
vr智慧党建主题展厅赋予企业数字化内涵
现如今,VR全景技术的发展让我们动动手指就能在线上参观博物馆、纪念馆,不仅不用受时间和空间的限制,还能拥有身临其境般的体验,使得我们足不出户就能随时随地学习、传承红色文化。 很多党建展厅都是比较传统的,没有运用…...
go中mutex的sema信号量是什么?
先看下go的sync.mutex是什么 type Mutex struct {state int32sema uint32 } 这里面有个sema,这个就是信号量。 什么是信号量? 什么是信号量?_kina100的博客-CSDN博客 其实通俗的来说,信号量就是信号灯,但是他不是…...
LeetCode笔记:Weekly Contest 360
LeetCode笔记:Weekly Contest 360 0. 吐槽1. 题目一 1. 解题思路2. 代码实现 2. 题目二 1. 解题思路2. 代码实现 3. 题目三 1. 解题思路2. 代码实现 4. 题目四 1. 解题思路2. 代码实现 比赛链接:https://leetcode.com/contest/weekly-contest-360/ 0.…...
【树DP】2021ICPC南京 H
Problem - H - Codeforces 题意: 思路: 这题应该算是铜牌题 铜牌题 简单算法 基础思维 简单复盘一下思路 首先,我们发现有个很特殊的条件: ti < 3 然后看一下样例: 注意到,对于一个结点 u &#…...
Leedcode19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5] 示例 2: 输入:head [1], n 1 输出:[] 示例 3: 输入࿱…...
Mysql-索引查询相关
一、单表查询 1.1 二级索引为null 不论是普通的二级索引,还是唯一二级索引,它们的索引列对包含 NULL 值的数量并不限制,所以我们采用key IS NULL 这种形式的搜索条件最多只能使用 ref 的访问方法,而不是 const 的访问方法 1.2 c…...
C++ Pimpl
Pimpl(Pointer to implementation,指向实现的指针) 是一种减少代码依赖和编译时间的C编程技巧,其基本思想是将一个外部可见类(visible class)的实现细节(一般是所有私有的非虚成员)放在一个单独的实现类(implementation class)中&…...
rust学习-类型转换
基本类型转换 // 不显示类型转换产生的溢出警告。 #![allow(overflowing_literals)]fn main() {let decimal 65.4321_f32;// 错误!不提供隐式转换// let integer: u8 decimal;// 可以显式转换let integer decimal as u8;let character integer as char;println…...
算法通过村第四关-栈青铜笔记|手写栈操作
文章目录 前言1. 栈的基础概要1.1 栈的特征1.2 栈的操作1.3 Java中的栈 2. 栈的实现(手写栈)2.1 基于数组实现2.2 基于链表实现2.3 基于LinkedList实现 总结 前言 提示:我自己一个人的感觉很好 我并不想要拥有你 除非你比我的独处更加宜人 --…...
VBA数据库解决方案第二十九讲 如何批量修改数据库中的数据
《VBA数据库解决方案》教程(版权10090845)是我推出的第二套教程,目前已经是第二版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…...
STM32F746G-DISCO音频BSP详解:I2S+DMA+CS43L22驱动开发
1. 项目概述AUDIO_DISCO_F746NG是 STMicroelectronics 官方 STM32CubeF7 软件包中为STM32F746G-DISCO 探索套件提供的音频底层支持包(Board Support Package, BSP)核心类。该类并非独立音频处理库,而是面向硬件抽象层(HAL…...
集团型企业BI试点,为什么一定要先做多域资源隔离?
艾瑞咨询《2025年中国BI市场报告》显示,超7成集团型企业的首次BI试点项目因跨业务单元权限冲突、数据口径混乱延期或终止(统计样本覆盖120家年营收超50亿的国内集团企业,统计窗口为2022-2024年试点项目全生命周期)。这个数据和大部…...
【若依】框架:从零构建前后端分离项目实战
1. 环境准备与项目初始化 第一次接触若依框架时,我被它"开箱即用"的特性惊艳到了。这个基于Spring Boot的权限管理系统,前后端分离架构设计得非常清晰。下面我会手把手带你完成环境搭建,过程中遇到的坑也会一并说明。 开发环境需要…...
秒杀系统主库宕机不丢单方案-03-本地消息表
秒杀系统主库宕机不丢单方案:本地消息表(事务分离补偿机制) 方案概述 本地消息表方案通过在应用层引入消息表机制,将事务操作与消息发送分离,实现最终一致性。该方案是秒杀系统主库宕机不丢单的兜底设计,即…...
SaaS的末日重构:AI Agent浪潮下的危机与新生
目录 前言 一、 市场恐慌的源头:“软件-PE”的死亡循环 二、 核心重构:AI 将如何改造企业级 SaaS? 2.1 交互层的降维打击:从“点界面”到“说意图” 2.2 流程层的动态重组:从“应用中心”到“工作流中心” 2.3 定…...
STM32F407ZGT6最小系统:从原理图到PCB的实战设计解析
1. STM32F407ZGT6最小系统设计入门 第一次接触STM32F407ZGT6最小系统设计时,我也被各种专业术语和复杂的电路图搞得晕头转向。但经过几个项目的实战后,我发现只要掌握几个关键模块,设计一个稳定可靠的最小系统其实并不难。STM32F407ZGT6是STM…...
STM32实战:sprintf格式化字符串在嵌入式LCD显示中的高效应用
1. sprintf函数在STM32开发中的基础应用 第一次在STM32上使用sprintf函数时,我被它的强大功能惊艳到了。这个看似简单的函数,却能帮我们把各种数据类型转换成整齐的字符串,这在嵌入式开发中简直是神器。记得当时我在调试一个温湿度传感器项目…...
英雄联盟智能工具League Akari:从效率提升到战术优化的全方位解决方案
英雄联盟智能工具League Akari:从效率提升到战术优化的全方位解决方案 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾在英…...
Unity UGUI实战:手把手教你打造一个可拖拽、可弯曲的UI连线组件(附完整源码)
Unity UGUI实战:打造可拖拽、可弯曲的智能连线系统 在游戏开发中,可视化连接系统是构建技能树、流程图、科技树等复杂UI结构的核心组件。传统实现往往局限于静态线条或简单的直线连接,缺乏交互性和动态美感。本文将带你从零构建一个支持实时拖…...
