python扫描线填充算法_LeetCode基础算法题第187篇:解压缩行程编码(RLE)列表

技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完。目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和精力有限,其他语言的实现有兴趣的朋友请自己尝试。

如果有任何问题可以在文章后评论或者私信给我。

如果有朋友希望我讲些其他话题,请在评论区留言或者私信给我。

持续分享,敬请关注

LeetCode 1313. 解压缩行程编码列表(Decompress Run-Length Encoded List)

问题描述:

给定一个nums整数列表,这些整数表示使用行程编码(Run-Length Encoded)压缩的列表。

行程编码列表:

每对相邻的元素[freq, val] = [nums[2i], nums[2i+1]] (i >= 0)。对于每个这样的对,freq 表示 原数据中,连续的出现数值val的数量。

返回解压缩后的列表。

注:

· 2 <= nums.length <= 100;

· nums.length % 2 == 0;

· 1 <= nums[i] <= 100;

示例:

bee839e06d82b173b052c70503cdb11c.png

C语言实现:

RLE是一种非常简单的"压缩"编码技术,在文本和二进制数据的无损压缩中可能会碰到。 据说windows的图形压缩就用到了这个技术。

RLE对连续重复的数据具有很好的压缩作用,如果数据非常离散,压缩效果就会比较差,RLE对于连续数据小于2的情况起不到压缩作用,甚至会导致压缩结果比原来的大的情况,所以压缩二字要打个引号。

对于RLE解压来说,最终的结果的长度是依赖nums中所有偶数下标数的和。实现过程有3种办法:

  1. 先初始化res,长度设置为一个初始值,遍历nums填充的时候,如果预期长度大于当前res长度的时候,增加res的长度,在填充;
  2. 遍历nums,计算出目标结果res的长度,从而创建res,然后再遍历一次nums来填充res;
  3. 创建一个可以动态扩容的容器,这样考虑长度的问题,直接填充,然后转换成结果类型;

对于C 语言实现我们使用的是第一种方法。

Java的实现我们尝试用第二种方法。

首先创建动态创建数组res,长度初始化为256,后面看情况再动态调整。

所以,这个长度任意,但不要太小,太小,需要频繁的调整,太大浪费资源。此外,实际生产中,建议值为16的幂,这样可以起到一定的对齐作用。

然后遍历nums。

在遍历过程中,首先要检查res的长度是否会超过预期,这要根据res当前已用的长度和预期要填充的长度来判断。如果超长了,那么调用realloc调整res的大小,注意realloc这个调用,它可能会为res分配一个新的地址,realloc成功的话会返回对象的起始地址,所以一定要将这个地址重新赋值给res。

然后开始一个内部循环,不断减小频率值以填充新数据到res中。

代码如下:

dde3f17c9ab8aec5c6a06da6cdafb2de.png
31720c9f957ddfd79163ee19ef6e211d.png

java语言实现:

Java的实现用第一种实现相对复杂,因为要频繁的创建 int[] 对象,所以效率也不见得好。

用第三种办法,实现很简单,可以创建一个List容器来实现,但是对于java来说List转换成int[]是一个硬伤。

所以最好的实现是第二种。

代码如下:

031b73f1c805cc71ed75d4c7fff57fc0.png
0516cc2edf7d1339bc61e983b0d7a871.png

python语言实现:

Python 用的是第三种实现。

代码如下:

1a14d79b24f70dc93c523f38bd145c72.png
4ebba4b38254d859f6765800bee00836.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值