LeetCode 1868. 两个行程编码数组的积(双指针)

文章目录

    • 1. 题目
    • 2. 解题
      • 2.1 模拟超时
      • 2.2 优化

1. 题目

行程编码(Run-length encoding)是一种压缩算法,能让一个含有许多段连续重复数字的整数类型数组 nums 以一个(通常更小的)二维数组 encoded 表示。

每个 encoded[i] = [vali, freqi] 表示 nums 中第 i 段重复数字,其中 vali 是该段重复数字,重复了 freqi 次。

例如, nums = [1,1,1,2,2,2,2,2] 可表示称行程编码数组 encoded = [[1,3],[2,5]] 。
对此数组的另一种读法是“三个 1 ,后面有五个 2 ”。
两个行程编码数组 encoded1 和 encoded2 的积可以按下列步骤计算:

  • 将 encoded1 和 encoded2 分别扩展成完整数组 nums1 和 nums2 。
  • 创建一个新的数组 prodNums ,长度为 nums1.length 并设 prodNums[i] = nums1[i] * nums2[i] 。
  • 将 prodNums 压缩成一个行程编码数组并返回之。

给定两个行程编码数组 encoded1 和 encoded2 ,分别表示完整数组 nums1 和 nums2 。
nums1 和 nums2 的长度相同。
每一个 encoded1[i] = [vali, freqi] 表示 nums1 中的第 i 段,每一个 encoded2[j] = [valj, freqj] 表示 nums2 中的第 j 段。

返回 encoded1 和 encoded2 的乘积。

注:行程编码数组需压缩成可能的最小长度

示例 1:
输入: encoded1 = [[1,3],[2,3]], encoded2 = [[6,3],[3,3]]
输出: [[6,6]]
解释n: encoded1 扩展为 [1,1,1,2,2,2] ,encoded2 扩展为 [6,6,6,3,3,3]。
prodNums = [6,6,6,6,6,6],压缩成行程编码数组 [[6,6]]。示例 2:
输入: encoded1 = [[1,3],[2,1],[3,2]], encoded2 = [[2,3],[3,3]]
输出: [[2,3],[6,1],[9,2]]
解释: encoded1 扩展为 [1,1,1,2,3,3] ,encoded2 扩展为 [2,2,2,3,3,3]。
prodNums = [2,2,2,6,9,9],压缩成行程编码数组 [[2,3],[6,1],[9,2]]
提示:
1 <= encoded1.length, encoded2.length <= 10^5
encoded1[i].length == 2
encoded2[j].length == 2
对于每一个 encoded1[i]1 <= vali, freqi <= 10^4  
对于每一个 encoded2[j]1 <= valj, freqj <= 10^4
encoded1 和 encoded2 表示的完整数组长度相同。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/product-of-two-run-length-encoded-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 模拟超时

class Solution:def findRLEArray(self, encoded1: List[List[int]], encoded2: List[List[int]]) -> List[List[int]]:n = sum([x[1] for x in encoded1])arr1 = [0]*narr2 = [0]*ni, idx = 0, 0while i < len(encoded1):t = encoded1[i][1]num = encoded1[i][0]while t > 0:arr1[idx] = numidx += 1t -= 1i += 1i, idx = 0, 0while i < len(encoded2):t = encoded2[i][1]num = encoded2[i][0]while t > 0:arr2[idx] = numidx += 1t -= 1i += 1p = [arr1[i]*arr2[i] for i in range(len(arr1))]ans = []ct = 0for i in range(len(p)):if i==0 or (i>0 and p[i] != p[i-1]):if i > 0:ans.append([p[i-1], ct])ct = 1else:ct += 1ans.append([p[-1], ct])return ans

2.2 优化

  • 一边检查,取出个数较少的,放入答案,同时检查跟答案尾部的是否数值一样,一样的话进行合并
class Solution:def findRLEArray(self, encoded1: List[List[int]], encoded2: List[List[int]]) -> List[List[int]]:i, j = 0, 0ans = []while i < len(encoded1) and j < len(encoded2):num = encoded1[i][0]*encoded2[j][0]if encoded1[i][1] > encoded2[j][1]:encoded1[i][1] -= encoded2[j][1]ct = encoded2[j][1]j+=1elif encoded1[i][1] < encoded2[j][1]:encoded2[j][1] -= encoded1[i][1]ct = encoded1[i][1]i+=1else:ct = encoded1[i][1]i+=1j+=1if len(ans)>0 and ans[-1][0]==num: # 数值一样,合并个数ans[-1][1] += ctelse:ans.append([num, ct])return ans

376 ms 62.9 MB Python3


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

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

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

相关文章

LeetCode MySQL 1587. 银行账户概要 II

文章目录1. 题目2. 解题1. 题目 表: Users ----------------------- | Column Name | Type | ----------------------- | account | int | | name | varchar | -----------------------account 是该表的主键. 表中的每一行包含银行里中每一个用户的账号…

LeetCode MySQL 1667. 修复表中的名字

文章目录1. 题目2. 解题1. 题目 表&#xff1a; Users ------------------------- | Column Name | Type | ------------------------- | user_id | int | | name | varchar | -------------------------user_id 是该表的主键。 该表包含用户的 I…

c语言汇编混合编程写一个乘法,求通过C语言实现矩阵的加、减及乘法。要自己写的,不要复制过来...

满意答案eevfikx22013.11.28采纳率&#xff1a;53% 等级&#xff1a;13已帮助&#xff1a;8891人#include using namespace std;int main(){int am3,bm3,an3,bn3;int a[am][an];int b[bm][bn];for(int i0;i{for(int j0;j{a[i][j]i*amj;}}for(int i0;i{for(int j0;j{b[i][j]i…

LeetCode MySQL 1821. 寻找今年具有正收入的客户

文章目录1. 题目2. 解题1. 题目 表&#xff1a;Customers -------------------- | Column Name | Type | -------------------- | customer_id | int | | year | int | | revenue | int | --------------------(customer_id, year) 是这个表的主键。 这个表…

【Head First Java 读书笔记】(一)基本概念

Java的工作方式 你要做的事情就是会编写源代码 Java的程序结构 类存于源文件里面 方法存在类中 语句存于方法中 剖析类 当Java虚拟机启动执行时&#xff0c;它会寻找你在命令列中所指定的类&#xff0c;然后它会锁定像下面这样一个特定的方法: public static void main(String[…

oid 值 内存使用_[技术干货] zabbix监控项原型组合键值

自动发现中监控项原型使用多个值组合成一个新的键值。这里我们以华为RH5885V3的内存为例&#xff1a;我们先walk出要用来作为组合键值的值&#xff0c;我们称之为VALUE。而OID节点后面延伸出来的数值&#xff0c;例如.1、.2、.3这种&#xff0c;我们称之为INDEX。组合键值的关键…

LeetCode MySQL 1853. 转换日期格式(日期格式化)

文章目录1. 题目2. 解题1. 题目 表: Days ------------------- | Column Name | Type | ------------------- | day | date | -------------------day 是这个表的主键。 给定一个Days表&#xff0c;请你编写SQL查询语句&#xff0c;将Days表中的每一个日期转化为&qu…

自定义计算器 android,自定义公式计算app下载

自定义公式计算器是非常强大的一款计算器软件&#xff0c;可以帮助大家计算各种函数&#xff0c;还能够自定义公式进行保存&#xff0c;便于以后的计算&#xff1b;软件包含了科学计算器的所有功能&#xff0c;而且没有广告&#xff0c;非常的方便和强大&#xff0c;喜欢的朋友…

android 行布局选择器,『自定义View实战』—— 银行种类选择器

在工作中难免遇到自定义 View 的相关需求&#xff0c;本身这方面比较薄弱&#xff0c;因此做个记录&#xff0c;也是自己学习和成长的积累。自定义View实战前言年前的最后一个开发需求&#xff0c;将之前H5开卡界面转变成native。意思就是开卡这个需求做成Android原生的界面&am…

LeetCode 1971. Find if Path Exists in Graph(图的遍历)

文章目录1. 题目2. 解题1. 题目 There is a bi-directional graph with n vertices, where each vertex is labeled from 0 to n - 1 (inclusive). The edges in the graph are represented as a 2D integer array edges, where each edges[i] [ui, vi] denotes a bi-directi…

更新wpscan_wpscan扫描工具

简介WPScan是一个扫描WordPress漏洞的黑盒子扫描器&#xff0c;可以扫描出wordpress的版本&#xff0c;主题&#xff0c;插件&#xff0c;后台用户以及爆破后台用户密码等&#xff0c;Kali Linux默认自带了WPScan&#xff0c;也可以到Github项目仓库[1]中下载安装&#xff0c;其…

LeetCode 1974. 使用特殊打字机键入单词的最少时间

文章目录1. 题目2. 解题1. 题目 有一个特殊打字机&#xff0c;它由一个 圆盘 和一个 指针 组成&#xff0c; 圆盘上标有小写英文字母 ‘a’ 到 ‘z’。 只有 当指针指向某个字母时&#xff0c;它才能被键入。指针 初始时 指向字符 ‘a’ 。 每一秒钟&#xff0c;你可以执行以…

LeetCode 1979. 找出数组的最大公约数

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums &#xff0c;返回数组中最大数和最小数的 最大公约数 。 两个数的 最大公约数 是能够被两个数整除的最大正整数。 示例 1&#xff1a; 输入&#xff1a;nums [2,5,6,9,10] 输出&#xff1a;2 解释&#xff1a; nums 中…

BZOJ 1529: [POI2005]ska Piggy banks( 并查集 )

每一连通块砸开一个就可以拿到所有的钱, 所以用并查集求连通块数 -------------------------------------------------------------------#include<bits/stdc.h>#define rep(i, n) for(int i 0; i < n; i)#define clr(x, c) memset(x, c, sizeof(x))using namespace …

LeetCode 1980. 找出不同的二进制字符串

文章目录1. 题目2. 解题1. 题目 给你一个字符串数组 nums &#xff0c;该数组由 n 个 互不相同 的二进制字符串组成&#xff0c;且每个字符串长度都是 n 。 请你找出并返回一个长度为 n 且 没有出现 在 nums 中的二进制字符串。 如果存在多种答案&#xff0c;只需返回 任意一个…

#时间预测算法_改进的智慧交通系统出行时间预测算法

引用Chowdhury N K, Leung C K S. Improved travel time prediction algorithms for intelligent transportation systems[C]//International Conference on Knowledge-Based and Intelligent Information and Engineering Systems. Springer, Berlin, Heidelberg, 2011: 355-3…

Navicat for MySQL数据库管理工具

官网下载地址&#xff1a;http://www.navicat.com/download/navicat-for-mysql //如图所示成功建立连接 Host Nmae/Ip Adress:localhost为本地连接&#xff0c;建立远程数据库连接时设置对应ip即可。 1&#xff09;.新建表插入中文数据可以出现&#xff1a; 导致程序直接关闭&a…

LeetCode 1981. 最小化目标值与所选元素的差(DP)

文章目录1. 题目2. 解题1. 题目 给你一个大小为 m x n 的整数矩阵 mat 和一个整数 target 。 从矩阵的 每一行 中选择一个整数&#xff0c;你的目标是 最小化 所有选中元素之 和 与目标值 target 的 绝对差 。 返回 最小的绝对差 。 a 和 b 两数字的 绝对差 是 a - b 的绝对…

hdu 5312 数学

转载于:https://www.cnblogs.com/cnblogs321114287/p/4676747.html

协程asyncio_Asyncio深入浅出

Asyncio是一个异步编程的框架&#xff0c;可以解决异步编程&#xff0c;协程调度问题&#xff0c;线程问题&#xff0c;是整个异步IO的解决方案。在学习asyncio之前&#xff0c;我们先来理清楚同步/异步的概念&#xff1a;同步是指完成事务的逻辑&#xff0c;先执行第一个事务&…