其他题目---两个有序数组间相加和的TopK问题

2023-10-29

【题目】

  给定两个有序数组arr1和arr2,再给定一个整数k,返回来自arr1和arr2的两个数相加和最大的前k个,两个数必须分别来自两个数组。要求时间复杂度O(klogk)。

【基本思路】

  使用大根堆结构。假设arr1的长度是M,arr2的长度是N。因为是排序数组,arr1中最后一个数加上arr2中最后一个数一定就是最大的相加和。将这个数压入大根堆中。然后从大根堆中弹出一个堆顶,此时这个堆顶一定是(M-1, N-1)位置的和,表示获得一个最大相加和。然后,将两个相邻位置的和再放入堆中,即位置(M-1,N-2)和(M-2, N-1),因为除(M-1, N-1)位置的和外,最大的相加和一定在位置(M-1,N-2)和(m-2, N-1)中产生。重新调整大根堆,然后继续弹出,继续将弹出元素的两个相邻位置添加到堆中,直到弹出的元素达到K个。

【代码实现】

#python3.5
class Heap:
    def __init__(self, row, col, value):
        self.row = row
        self.col = col
        self.value = value

def getTopKSum(arr1, arr2, k):
    def heapInsert(heap, row, col, data, i):
        node = Heap(row, col, data)
        heap[i] = node
        parent = (i-1) // 2
        while parent >= 0 and heap[parent].value < heap[i].value:
            heap[parent], heap[i] = heap[i], heap[parent]
            i = parent
            parent = (i-1) // 2

    def popHead(heap, heapSize):
        res = heap[0]
        heap[0], heap[heapSize-1] = heap[heapSize-1], heap[0]
        heapify(heap, 0, heapSize-1)
        return res

    def heapify(heap, i, heapSize):
        left = 2 * i + 1
        right = 2 * i + 2
        most = i
        while left < heapSize:
            if heap[left].value > heap[i].value:
                most = left
            if right < heapSize and heap[right].value > heap[most].value:
                most = right
            if most == i:
                break
            else:
                heap[most], heap[i] = heap[i], heap[most]
                i = most
                left = 2 * i + 1
                right = 2 * i + 2

    def isContains(row, col, posSet):
        return '_'.join([str(row),str(col)]) in posSet

    def addPosToSet(row, col, posSet):
        posSet.add('_'.join([str(row), str(col)]))



    if arr1 == None or arr2 == None or k < 1 or k > len(arr1) * len(arr2):
        return
    heap = [0 for i in range(k+1)]
    row = len(arr1) - 1
    col = len(arr2) - 1
    heapSize = 0
    heapInsert(heap, row, col, arr1[row] + arr2[col], heapSize)
    heapSize += 1
    posSet = set()
    count = 0
    res = []
    while count < k:
        cur = popHead(heap, heapSize)
        heapSize -= 1
        res.append(cur.value)
        r = cur.row
        c = cur.col
        if not isContains(r-1,c, posSet):
            heapInsert(heap, r-1, c, arr1[r-1] + arr2[c], heapSize)
            heapSize += 1
            addPosToSet(r-1, c, posSet)
        if not isContains(r, c-1, posSet):
            heapInsert(heap, r, c-1, arr1[r] + arr2[c-1], heapSize)
            heapSize += 1
            addPosToSet(r, c-1, posSet)
        count += 1
    return res
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

其他题目---两个有序数组间相加和的TopK问题 的相关文章

  • python导入模块时如何避免一直写模块名?

    我用math最近模块很多 我不想写math sqrt x and math sin x 每时每刻 我想缩短它并写sqrt x and sin x How 对于较长的模块名称 通常会缩短它们 例如 import numpy as np 然后您
  • 编辑 scikit-learn 决策树

    我想编辑 sklearn DecisionTree 例如改变条件或切割节点 叶子等 但似乎没有功能可以做到这一点 如果我可以导出到文件 编辑它以导入 如何编辑决策树 环境 Windows 10 python3 3 sklearn 0 17
  • Python 在 chroot 中运行时出现错误

    我尝试在 chroot 中运行一些 Python 程序 但出现以下错误 Could not find platform independent libraries
  • Python的reduce()短路了吗?

    If I do result reduce operator and False 1000 得到第一个结果后它会停止吗 自从False anything False 相似地 result reduce operator or True 10
  • 如何从谷歌云存储桶读取音频文件并在datalab笔记本中使用ipd播放

    我想在数据实验室笔记本中播放我从谷歌云存储桶中读取的声音文件 这个怎么做 import numpy as np import IPython display as ipd import librosa import soundfile as
  • Django 的 URL 覆盖率测试为 0%,为什么?

    使用姜戈鼻子 我对 URL 进行了测试 但 URL 覆盖率仍然为 0 为什么 python manage py 测试配置文件 这是我的报道 Name Stmts Miss Cover Missing profiles 0 0 100 pro
  • 如何使用循环将十进制转换为二进制?

    我想编写一个程序 将十进制数 0 到 9 转换为二进制数 我可以编写如何使用重复除法将十进制数转换为二进制数的代码 但是 我在创建一个以二进制格式打印十进制数字 0 到 9 的循环时遇到了麻烦 这是我的代码 number 0 remaind
  • 一行Python和SQLite代码,为什么需要加“,”? [复制]

    这个问题在这里已经有答案了 c execute INSERT INTO numbers VALUES random randint 0 100 如果我将上面的代码更改为 c execute INSERT INTO numbers VALUE
  • 在 matplotlib 中使用 yscale('log') 时缺少误差线

    在某些情况下 当使用对数刻度时 matplotlib 会错误地显示带有误差条的图 假设这些数据 例如在 pylab 内 s 19 0 20 0 21 0 22 0 24 0 v 36 5 66 814250000000001 130 177
  • pip 安装软件包两次

    不幸的是我无法重现它 但我们已经见过几次了 pip 将一个软件包安装两次 如果卸载第一个 第二个就会可见并且也可以被卸载 我的问题 如果一个包安装了两次 如何用 python 检查 背景 我想编写一个测试来检查这一点 devOp Updat
  • Python正则表达式从字符串中获取浮点数

    我正在使用正则表达式来解析字符串中的浮点数 re findall a zA Z d d t 是我使用的代码 这段代码有问题 如果数字和任何字符之间没有空格 则不会解析该数字 例如 0 1 2 3 4 5 6 7 8 9 的预期输出为 0 1
  • Spark中的count和collect函数抛出IllegalArgumentException

    当我使用时抛出此异常时 我尝试在本地 Spark 上加载一个小数据集count 在 PySpark 中 take 似乎有效 我试图搜索这个问题 但没有找到原因 看来RDD的分区有问题 有任何想法吗 先感谢您 sc stop sc Spark
  • numpy.cov() 返回意外的输出

    我有一个 X 数据集 有 9 个特征和 683 行 683x9 我想获取这个 X 数据集和另一个与 X 具有相同形状的数据集的协方差矩阵 我使用np cov originalData generatedData rowvar False 代
  • 如何强制 Y 轴仅使用整数

    我正在使用 matplotlib pyplot 模块绘制直方图 我想知道如何强制 y 轴标签仅显示整数 例如 0 1 2 3 等 而不显示小数 例如 0 0 5 1 1 5 2 等 我正在查看指导说明并怀疑答案就在附近matplotlib
  • 大型数据集上的 Sklearn-GMM

    我有一个很大的数据集 我无法将整个数据放入内存中 我想在这个数据集上拟合 GMM 我可以用吗GMM fit sklearn mixture GMM 重复小批量数据 没有理由重复贴合 只需随机采样您认为机器可以在合理时间内计算的尽可能多的数据
  • 在 Python 的 Textmate 中突出显示尾随空格?

    我想做类似的事情this http remysharp com 2008 03 30 trailing white space in textmate Textmate 提示 这样当我在 Python 中编写代码时 尾随空白总是以某种方式突
  • 如何使用Featuretools按列值从单个数据框中的多个列创建特征?

    我正在尝试根据之前的结果来预测足球比赛的结果 我在 Windows 上运行 Python 3 6 并使用 Featuretools 0 4 1 假设我有以下代表结果历史记录的数据框 原始数据框 https i stack imgur com
  • issubclass() 对从不同路径导入的同一类返回 False

    目的是实现某种插件框架 其中插件是同一基类 即 A 的子类 即 B 基类使用标准导入加载 而子类使用 imp load module 从众所周知的包 即 pkg 的路径加载 pkg init py mod1 py class A mod2
  • 在Python中从日期时间中减去秒

    我有一个 int 变量 它实际上是秒 让我们调用这个秒数X 我需要得到当前日期和时间 以日期时间格式 减去的结果X秒 Example If X是 65 当前日期是2014 06 03 15 45 00 那么我需要得到结果2014 06 03
  • Python 枚举子集迭代

    我想迭代以下枚举的子集 class Items enum Enum item1 0 item2 1 item3 2 item4 3 item5 4 item6 5 item7 6 item8 7 说我想 for item in Items

随机推荐

  • MYSQL中的连接查询

    通过对DQL的学习 我们可以很轻松的从 张数据表中查询出需要的数据 在企业的应 开发中 我们经常需要从多张表中查询数据 例如 我们查询学 信息的时候需要同 时查询学 的班级信息 可以通过连接查询从多张数据表提取数据 在MySQL中可以使 j
  • CentOS 7 openssl 3.0.10 rpm包制作 —— 筑梦之路

    源码下载地址 https www openssl org source openssl 3 0 10 tar gz 编写spec文件 cat lt lt EOF gt openssl spec Summary OpenSSL 3 0 10
  • Android 代码优化工具FindBugs

    原文地址 https juejin im post 58d4e35261ff4b00605326d9 1 前言 在我们平时项目开发中 经常会写一些不严谨的代码或者一些比较低级的错误代码 但是这些错误往往很难被发现 这样就导致了我们的项目中会
  • 洛谷 P1226 【模板】快速幂

    题目链接 https www luogu com cn problem P1226 include
  • 上半年实现营收9.24亿元,创新奇智的AI成制造业福星?

    如今 AI大模型迈入了商业化落地的新阶段 并且已经有不少产品被不知不觉地应用到了生活各个方面 其中 作为AI领域的后起之秀 创新奇智也于近日发布了截至2023年6月30日止六个月的中期业绩报告 数据显示 创新奇智2023年上半年公司实现营收
  • 线代【向量组与线性空间】--猴博士爱讲课

    第五课 向量组与线性空间 1 4判断某向量是否可由某向量组线性表示 这些只有一行 列 的矩阵既可以称作为向量 判断的标准 若 a1 a2 am 的秩与 a1 a2 am b 的秩相等 则b可由a a2 am线性表示 2 4判断某个向量组是否
  • final关键字最全了解

    final关键字的使用 在Java中声明类 属性和方法时 可使用关键字final来修饰 1 final标记的类不能被继承 2 final标记的方法不能被子类复写 3 final标记的变量 成员变量或局部变量 即为常量 只能赋值一次 fina
  • 消息队列之Kafka 日志清理(六)

    Kafka是一个基于日志的流处理平台 一个topic可以有多个分区 partition 分区是复制的基本单元 在单节点上 一个分区的数据文件可以存储在多个磁盘目录中 配置项是 A comma separated list of direct
  • ps 命令

    NAME ps report a snapshot of the current processes SYNOPSIS ps aAcdefHjlmNVwy acefghLnrsSTuvxX C lt 指令名称 gt g lt 群组名称 gt
  • 使用Java实现文件的上传

    基于表单的文件上传 标签
  • ASPX如何调用外界程序

    调用外界程序 用到Process类 这个相当于在运行中输入命令 而不是在cmd中输入命令 aspx cs页 Start方法应该是静态方法 1 using System Diagnostics 2 3 Process Start cmd c
  • idea写的过滤器

    Servlet 概念 Server 服务 applet 小程序 是运行在服务器端 tomcat 的java程序 作用 接受客户端发送过来的请求并做出响应 重定向和转发 gt 客户端 注解 Filter 过滤器 概念 过滤器实际上就是对web
  • pv=nrt_PV=NRT中的R的单位是什么?

    展开全部 1 气体状态方程的常数 2 n是物质的量 R是常数 对任意理想气体而言 R是一定的 约为e68a8462616964757a686964616f313333656532308 31441 0 00026J mol K PV nRT
  • swarm原理与使用

    一 Swarm简介 在Docker的官方文档当中 我们可以看到在Docker 1 12及更高版本中 Swarm模式与Docker Engine集成 那么Dokcer Swarm到底是个什么 Docker Swarm是Docker官方的三剑客
  • 【亲测有效】Win10家庭版Microsoft Edge页面出现乱码的两种解决方案及gpedit.msc命令无法使用的解决策略...

    昨天在爬取电影的时候生成的表单打开result html时 发现页面出现如下乱码 第一种方法 上网找了半天 网上的解决方案是这样的 1 Win R输入gpedit msc打开组策略编辑器 2 定位到计算机配置 rarr 管理模板 windo
  • 数据结构与算法分析——第3章考试题

    判断题 1 1 Run the following operations on a stack S Push S 1 Push S 2 Pop S Push S 3 Pop S Pop S The output sequence must
  • 小程序对接企业微信客服

    一 小程序后台管理 关联企业微信客服 注意 企业ID必须跟该小程序的企业主体一样 二 登录企业微信 选择客服 登录企业微信后台 应用管理 应用 微信客服 接入场景 在微信内其他场景接入 去接入 选择客服 复制客服链接 注意 如果需要后台对接
  • 【性能测试-03】 - 如何指定性能测试目标

    文章目录 引言 定制计划 衡量指标 TPS 响应时间 报错率 性能测试指标分析 1 以衡量系统处理能力为核心目标的性能测试 时间维度 服务维度 系统健壮性 专项能力 总结 引言 在测试执行过程当中 并不清楚现在测试到的结果到底能不能满足活动
  • (5)所有角色数据分析页面的构建-5

    所有角色数据分析页面 包括一个时间轴柱状图 六个散点图 六个柱状图 每个属性角色的生命值 防御力 攻击力的max与min的对比 绘图 from pyecharts charts import Timeline from find type
  • 其他题目---两个有序数组间相加和的TopK问题

    题目 给定两个有序数组arr1和arr2 再给定一个整数k 返回来自arr1和arr2的两个数相加和最大的前k个 两个数必须分别来自两个数组 要求时间复杂度O klogk 基本思路 使用大根堆结构 假设arr1的长度是M arr2的长度是N