【数据结构与算法】力扣刷题记之 稀疏数组

news2025/1/20 3:52:02

 🎉🎉欢迎光临🎉🎉

🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀

🌟特别推荐给大家我的最新专栏《数据结构与算法:初学者入门指南》📘📘

本专栏纯属为爱发电永久免费!!!

这是苏泽的个人主页可以看到我其他的内容哦👇👇

努力的苏泽icon-default.png?t=N7T8http://suzee.blog.csdn.net/

目录

深入理解稀疏数组

稀疏数组:概念与应用场景

第一节:稀疏数组的基础概念及应用场景

第二节:实现稀疏数组的转换与应用

实现稀疏数组的转换

通过稀疏数组恢复出原始的普通数组。具体恢复过程如下:

稀疏数组的恢复与应用

探讨稀疏数组在题目以及实际开发中的应用场景

题目描述

稀疏数组压缩与恢复算法

思路分析


深入理解稀疏数组

稀疏数组:概念与应用场景

第一节:稀疏数组的基础概念及应用场景

稀疏数组是一种特殊的数组数据结构,其特点是大部分元素为同一值或者为0。在实际应用中,稀疏数组常常被用来存储那些绝大多数元素为0的二维数据,如图像、矩阵等。一个典型的应用场景是图像处理中的位图压缩。

在不使用稀疏数组的情况下,如果直接用二维数组来表示稀疏性很高的数据结构,会导致大量的存储空间浪费和性能损耗。例如,对于一个大规模的稀疏矩阵,如果每个元素都占用存储空间,将会占用大量的存储空间。而且在处理这样的数据结构时,需要额外的时间复杂度来遍历和操作大量的0值元素。

引入稀疏数组可以有效解决上述问题。通过稀疏数组的存储方式,我们可以只存储非零元素及其位置信息,从而大大减少存储空间的占用。同时,在对稀疏数组进行操作时,可以极大地提高程序的运行效率。

第二节:实现稀疏数组的转换与应用

实现稀疏数组的转换

下面是一个简单的示例代码,用于将普通的二维数组转换为稀疏数组:

假设我们有一个普通的二维数组如下:

普通数组:

 [[0, 0, 0, 0, 0],
 [0, 5, 0, 0, 0],
 [0, 0, 8, 0, 0],
 [0, 0, 0, 0, 0]]

我们希望将这个普通数组转换为稀疏数组。转换过程中,我们需要记录非零元素的位置和数值,并在稀疏数组的第一行记录原始数组的行数、列数和非零元素个数。具体转换过程如下:

遍历原始数组,记录非零元素及其位置:

非零元素 (1, 1) 值为 5
非零元素 (2, 2) 值为 8
 

将记录的非零元素及其位置转换为稀疏数组:

稀疏数组:

[[4, 5, 2],  # 第一行记录原始数组的行数、列数和非零元素个数
 [1, 1, 5],  # 非零元素 (1, 1) 值为 5
 [2, 2, 8]]  # 非零元素 (2, 2) 值为 8

通过稀疏数组恢复出原始的普通数组。具体恢复过程如下:

  1. 根据稀疏数组的第一行信息创建一个全为0的普通数组。

  2. 遍历稀疏数组中的非零元素,根据其位置信息将对应的值填入新建的普通数组中。

def convert_to_sparse_array(arr):
    sparse_arr = []
    rows, cols = len(arr), len(arr[0])
    count = 0

    # 遍历原始数组,记录非零元素及其位置
    for i in range(rows):
        for j in range(cols):
            if arr[i][j] != 0:
                sparse_arr.append([i, j, arr[i][j]])
                count += 1

    # 在稀疏数组的第一行记录原始数组的行数、列数和非零元素个数
    sparse_arr.insert(0, [rows, cols, count])

    return sparse_arr

稀疏数组的恢复与应用

除了将普通数组转换为稀疏数组,我们还需要实现将稀疏数组恢复为普通数组的功能。下面是一个简单的示例代码:

def restore_from_sparse_array(sparse_arr):
    rows, cols, count = sparse_arr[0]
    restored_arr = [[0 for _ in range(cols)] for _ in range(rows)]

    for i in range(1, count+1):
        row, col, val = sparse_arr[i]
        restored_arr[row][col] = val

    return restored_arr

探讨稀疏数组在题目以及实际开发中的应用场景

稀疏数组在实际项目中有许多应用场景,如图像处理、文本搜索、语音识别等。其中,最常见的应用场景是图像处理中的位图压缩。

在算法题领域中,稀疏数组也有广泛的应用。例如力扣(LeetCode)中的73题矩阵置零,就可以使用稀疏数组来进行优化,减少存储空间的占用。

力扣(LeetCode)73题矩阵置零的原题如下:

题目描述

给定一个m x n的矩阵,如果一个元素为0,则将其所在行和列的所有元素都设为0。请使用原地算法。

示例 1:

输入:
[
  [1,1,1],
  [1,0,1],
  [1,1,1]
]
输出:
[
  [1,0,1],
  [0,0,0],
  [1,0,1]
]

示例 2:

输入:
[
  [0,1,2,0],
  [3,4,5,2],
  [1,3,1,5]
]
输出:
[
  [0,0,0,0],
  [0,4,5,0],
  [0,3,1,0]
]
// 稀疏数组压缩算法示例
void compress(int** ori_arr, int row, int col, int* arr_len, int*** com_arr) {
    int count = 0;
    for (int i = 0; i < row; ++i) {
        for (int j = 0; j < col; ++j) {
            if (ori_arr[i][j] != 0) {
                ++count;
            }
        }
    }

    *com_arr = malloc((count + 1) * sizeof(int*));
    (*com_arr)[0] = malloc(3 * sizeof(int));
    (*com_arr)[0][0] = row;
    (*com_arr)[0][1] = col;
    (*com_arr)[0][2] = count;

    int index = 1;
    for (int i = 0; i < row; ++i) {
        for (int j = 0; j < col; ++j) {
            if (ori_arr[i][j] != 0) {
                (*com_arr)[index] = malloc(3 * sizeof(int));
                (*com_arr)[index][0] = i;
                (*com_arr)[index][1] = j;
                (*com_arr)[index][2] = ori_arr[i][j];
                ++index;
            }
        }
    }

    *arr_len = count + 1;
}

// 稀疏数组恢复算法示例
void restore(int** ori_arr, int* arr_len, int*** com_arr) {
    int row = (*com_arr)[0][0];
    int col = (*com_arr)[0][1];

    for (int i = 0; i < row; ++i) {
        for (int j = 0; j < col; ++j) {
            ori_arr[i][j] = 0;
        }
    }

    for (int i = 1; i < *arr_len; ++i) {
        int x = (*com_arr)[i][0];
        int y = (*com_arr)[i][1];
        int val = (*com_arr)[i][2];
        ori_arr[x][y] = val;
    }
}

稀疏数组压缩与恢复算法

思路分析

稀疏数组的压缩算法可以将数组进行压缩,从而减少存储空间的占用。具体来说,稀疏数组的压缩算法会按照一定的规则,将非零元素的值及其所在的位置信息记录下来,并将其存储为三元组的形式。

以下是稀疏数组的压缩算法思路:

  1. 遍历原始数组,统计非零元素的个数count。
  2. 创建一个新的二维数组com_arr,大小为(count + 1) * 3,其中count + 1表示非零元素的个数加上一行用于记录原始数组的行数、列数和非零元素的总个数。
  3. 将原始数组的行数、列数和非零元素的总个数分别存储在com_arr的第一行。
  4. 遍历原始数组,将非零元素的行、列和值存储在com_arr的后续行中。
  5. 返回压缩后的数组com_arr和非零元素的个数count + 1。

稀疏数组的恢复算法则是根据压缩时的规则将压缩后的数据恢复为原始的数组数据。

以下是稀疏数组的恢复算法思路:

  1. 根据压缩后的数组com_arr的第一行,获取原始数组的行数row、列数col。
  2. 创建一个新的二维数组ori_arr,大小为row * col,并将其所有元素初始化为0。
  3. 遍历com_arr的后续行,将非零元素的值和对应的位置信息恢复到ori_arr中。
  4. 返回恢复后的数组ori_arr。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1441667.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书添加模块UI设计实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

ClickHouse的优缺点和应用场景

当业务场景需要一个大批量、快速的、可支持聚合运算的数据库&#xff0c;那么可选择ClickHouse。 选择ClickHouse 的原因&#xff1a; 记录类型类似于LOG&#xff0c;读取、运算远远大于写入操作选取有限列&#xff0c;对近千万条数据&#xff0c;快算的运算出结果。数据批量…

LiteFlow规则引擎框架

LiteFlow规则引擎框架 Hi&#xff0c;我是阿昌&#xff0c;今天介绍一个规则引擎框架&#xff0c;LiteFlow&#xff1b; 一、前言 那首先得知道什么是规则引擎&#xff1f;规则引擎是 一种用于自动化处理业务规则的软件组件。 在软件行业中&#xff0c;规则引擎通常用于解决…

HTML+CSS+JS网页设计

文章目录 作品介绍一、代码演示1.登录、注册&#xff0c;获取当前时间2.轮播图3.家乡简介4.热门景点5.特色美食6.页尾 二、效果图总结 作品介绍 HTML页面主要由&#xff1a;登录、注册跳转页面&#xff0c;轮播图&#xff0c;家乡简介&#xff0c;热门景点&#xff0c;特色美食…

js中new操作符详解

文章目录 一、是什么二、流程三、手写new操作符 一、是什么 在JavaScript中&#xff0c;new操作符用于创建一个给定构造函数的实例对象 例子 function Person(name, age){this.name name;this.age age; } Person.prototype.sayName function () {console.log(this.name) …

NOVATEK显示技术系列之CEDSCHPI Training差异简介

CEDS的数据封包格式&#xff1a;首先CEDS数据封包包括三个部分&#xff1a; Training Pattern即Phase1Control Data 即 Phase2RGB Data 即Phase3 Power on Timing&#xff1a; 工作原理&#xff1a; Power ON时&#xff0c;TCON会发Training Pattern&#xff0c;当COF接受Tr…

springboot-web服务迁移Kubernetes

1、搞定基础镜像 docker pull openjdk:8-jre-alpine docker tag openjdk:8-jre-alpine 10.204.82.15/kubernetes/openjdk:8-jre-alpine docker push 10.204.82.15/kubernetes/openjdk:8-jre-alpine 2、springboot-web应用服务打包 3、编写Dockerfile构建镜像 FROM 10.204.82.…

Vue源码系列讲解——虚拟DOM篇【二】(Vue中的DOM-Diff)

目录 1. 前言 2. patch 3. 创建节点 4. 删除节点 5. 更新节点 6. 总结 1. 前言 在上一篇文章介绍VNode的时候我们说了&#xff0c;VNode最大的用途就是在数据变化前后生成真实DOM对应的虚拟DOM节点&#xff0c;然后就可以对比新旧两份VNode&#xff0c;找出差异所在&…

uTools工具使用

之前发现一款非常有用的小工具&#xff0c;叫uTools&#xff0c;该软件集成了比如进制转换、json格式化、markdown、翻译、取色等等集插件大成&#xff0c;插件市场提供了很多开源插件工具。可以帮助开发人员节省了寻找各种处理工具的时间&#xff0c;非常推荐。 1、软件官方下…

横扫Spark之 - 22个常见的转换算子

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 1. map()2. flatMap()3. filter()4. mapPartitions()5. mapPartitionsWithIndex()6. groupBy()7. distinct()8. coalesce()9. repartition()10. sortBy()11. intersection()12.union()13.…

Python实现文本情感分析

前言 文本情感分析是一种重要的自然语言处理(NLP)任务&#xff0c;旨在从文本数据中推断出情感信息&#xff0c;例如正面、负面或中性情感。它在社交媒体分析、产品评论、市场调研等领域都有广泛的应用。本文将详细介绍如何使用Python进行文本情感分析&#xff0c;包括基础概念…

07 A B 从计数器到可控线性序列机

07. A.从计数器到可控线性序列机 让LED灯按照亮0.25秒。灭0.75秒的状态循环亮灭让LED灯按照亮0.25秒&#xff0c;灭0.5秒&#xff0c;亮0.75秒&#xff0c;灭1秒的状态循环亮灭让LED灯按照指定的亮灭模式亮灭&#xff0c;亮灭模式未知&#xff0c;由用户随即指定。以0.25秒为一…

前端实现支付跳转以及回跳

// 支付地址 const baseURL http://pcapi-xiaotuxian-front-devtest.itheima.net/ const backURL http://127.0.0.1:5173/paycallback const redirectUrl encodeURIComponent(backURL) const payUrl ${baseURL}pay/aliPay?orderId${route.query.id}&redirect${redirec…

js-添加网页快捷方式

title: js-添加网页快捷方式 categories: Javascript tags: [p快捷方式] date: 2024-02-04 15:28:25 comments: false mathjax: true toc: true js-添加网页快捷方式 前篇 谷歌上包困难的情况, 只能通过投放落地页来缓解一下痛苦, web2app 那种形式有几个比较大的缺点就是需要…

江科大STM32 终

目录 SPI协议10.1 SPI简介W25Q64简介10.3 SPI软件读写W25Q6410.4 SPI硬件外设读写W25Q64 BKP备份寄存器、PER电源控制器、RTC实时时钟11.0 Unix时间戳代码示例&#xff1a;读写备份寄存器BKP11.2 RTC实时时钟 十二、PWR电源控制12.1 PWR简介代码示例&#xff1a;修改主频12.3 串…

奇瑞汽车,好好卖车,别趟个人是非的浑水

文 | AUTO芯球 作者 | 雷歌 这下&#xff0c;奇瑞法务部忙都忙不过来了。 一个字&#xff0c;就是&#xff0c;告&#xff01;告&#xff01;告&#xff01; 刚投诉完这家&#xff0c;又去告那家。 可是骂奇瑞的实在太多了&#xff0c;告不完&#xff0c;根本告不完。 有骂…

一起玩儿Proteus仿真(C51)——04. 直流电机的启停、加减速和正反转仿真(L298)(二)

摘要&#xff1a;本文介绍PWM信号的产生办法和直流电机的启停、加减速和正反转的仿真程序的编写方法 前边已经介绍了2中生成PWM信号的方法了。那么怎样才能节省一下资源&#xff0c;只使用一个定时器呢&#xff1f;这就是介绍的第三种方法&#xff0c;单定时器中断法生成PWM信号…

Redis篇之双写一致性

一、什么的双写一致性 1.定义 双写一致性&#xff1a;当修改了数据库的数据也要同时更新缓存的数据&#xff0c;缓存和数据库的数据要保持一致。 2.正常情况 读操作&#xff1a;缓存命中&#xff0c;直接返回&#xff1b;缓存没命中查询数据库&#xff0c;写入缓存&#xff…

-打印流-

打印流分为字节打印流&#xff1a;PrintStream 字符打印流&#xff1a;PrintWriter特点1&#xff1a;都是只能输出 不能读取 字节打印流&#xff1a; 构造方法&#xff1a;主要用上面的两个构造 成员方法&#xff1a; //创建字节打印流对象&#xff1a;ctrlp注意参数 Prin…

OpenCV 笔记(20):霍夫圆检测

1. 霍夫圆变换 霍夫圆变换(Hough Circle Transform)是一种数字图像处理中的特征提取技术&#xff0c;用于在图像中检测圆形。它将二维图像空间中一个圆转换为该圆半径、圆心横纵坐标所确定的三维参数空间中一个点的过程。因此&#xff0c;圆周上任意三点所确定的圆&#xff0c…