两个有序数组间相加和的Topk问题

简介: 左边跟上边拽出来进堆一直到收集K个为止注意:防止同一个位置进入堆要保证进大根堆不要重复进代码

文章目录

前言

解题思路

代码

前言

描述

给定两个有序数组arr1和arr2,再给定一个整数k,返回来自arr1和arr2的两个数相加和最大的前k个,两个数必须分别来自两个数组

按照降序输出

[要求]

时间复杂度为O(k \log k)O(klogk)

输入描述:

第一行三个整数N, K分别表示数组arr1, arr2的大小,以及需要询问的数

接下来一行N个整数,表示arr1内的元素

再接下来一行N个整数,表示arr2内的元素

输出描述:

输出K个整数表示答案


解题思路


大根堆

arr1做行对应

arr2做列对应

最大值是右下角



左边跟上边拽出来进堆


一直到收集K个为止

注意:防止同一个位置进入堆

要保证进大根堆不要重复进


代码

public static void main(String[] args) {

 Scanner sc = new Scanner(System.in);

 int N = sc.nextInt();

 int K = sc.nextInt();

 int[] arr1 = new int[N];

 int[] arr2 = new int[N];

 for (int i = 0; i < N; i++) {

  arr1[i] = sc.nextInt();

 }

 for (int i = 0; i < N; i++) {

  arr2[i] = sc.nextInt();

 }

 int[] topK = topKSum(arr1, arr2, K);

 for (int i = 0; i < K; i++) {

  System.out.print(topK[i] + " ");

 }

 System.out.println();

 sc.close();

}


// 放入大根堆中的结构

public static class Node {

 public int index1;// arr1中的位置

 public int index2;// arr2中的位置

 public int sum;// arr1[index1] + arr2[index2]的值


 public Node(int i1, int i2, int s) {

  index1 = i1;

  index2 = i2;

  sum = s;

 }

}


// 生成大根堆的比较器

public static class MaxHeapComp implements Comparator<Node> {

 @Override

 public int compare(Node o1, Node o2) {

  return o2.sum - o1.sum;

 }

}


public static int[] topKSum(int[] arr1, int[] arr2, int topK) {

 if (arr1 == null || arr2 == null || topK < 1) {

  return null;

 }

 int N = arr1.length;

 int M = arr2.length;

 topK = Math.min(topK, N * M);

 int[] res = new int[topK];

 int resIndex = 0;

 PriorityQueue<Node> maxHeap = new PriorityQueue<>(new MaxHeapComp());

 HashSet<Long> set = new HashSet<>();

 int i1 = N - 1;

 int i2 = M - 1;

 maxHeap.add(new Node(i1, i2, arr1[i1] + arr2[i2]));

 set.add(x(i1, i2, M));

 while (resIndex != topK) {

  Node curNode = maxHeap.poll();

  res[resIndex++] = curNode.sum;

  i1 = curNode.index1;

  i2 = curNode.index2;

  set.remove(x(i1, i2, M));

  if (i1 - 1 >= 0 && !set.contains(x(i1 - 1, i2, M))) {

   set.add(x(i1 - 1, i2, M));

   maxHeap.add(new Node(i1 - 1, i2, arr1[i1 - 1] + arr2[i2]));

  }

  if (i2 - 1 >= 0 && !set.contains(x(i1, i2 - 1, M))) {

   set.add(x(i1, i2 - 1, M));

   maxHeap.add(new Node(i1, i2 - 1, arr1[i1] + arr2[i2 - 1]));

  }

 }

 return res;

}


public static long x(int i1, int i2, int M) {

 return (long) i1 * (long) M + (long) i2;

}



目录
相关文章
|
7月前
|
JSON API 开发者
天猫商品详情 API 接口:功能、调用与实战攻略
天猫商品详情API为电商从业者、开发者和数据分析人员提供高效的商品数据获取途径。通过商品ID,该接口可返回包括基本信息、价格、库存及图片等详细内容,具有高准确性、易集成和功能丰富的特点。示例代码展示了如何用Python调用此API,生成签名确保请求安全,助力用户优化定价策略、开发应用或分析市场趋势。
456 10
信不信?工作这么多年,还有很多网工不知道光模块光衰的正常范围?
信不信?工作这么多年,还有很多网工不知道光模块光衰的正常范围?
1469 2
|
前端开发 JavaScript 定位技术
一、前端高德地图注册、项目中引入、渲染标记(Marker)and覆盖物(Circle)
文章介绍了如何在前端项目中注册并使用高德地图API,包括注册高德开放平台账号、引入高德地图到项目、以及如何在地图上渲染标记(Marker)和覆盖物(Circle)。
495 1
|
安全 PHP 开发者
PHP中的异常处理:从入门到高级
在PHP的编程世界中,异常处理是一块不可或缺的拼图。本文将通过浅显易懂的语言和实际代码示例,带你了解如何在PHP中捕获、处理异常,并探讨高级异常管理策略。无论你是PHP新手还是资深开发者,这篇文章都能为你提供新的见解和技巧。
116 28
|
XML 监控 Java
Spring Cloud全解析:熔断之Hystrix简介
Hystrix 是由 Netflix 开源的延迟和容错库,用于提高分布式系统的弹性。它通过断路器模式、资源隔离、服务降级及限流等机制防止服务雪崩。Hystrix 基于命令模式,通过 `HystrixCommand` 封装对外部依赖的调用逻辑。断路器能在依赖服务故障时快速返回备选响应,避免长时间等待。此外,Hystrix 还提供了监控功能,能够实时监控运行指标和配置变化。依赖管理方面,可通过 `@EnableHystrix` 启用 Hystrix 支持,并配置全局或局部的降级策略。结合 Feign 可实现客户端的服务降级。
782 23
|
存储 域名解析 Kubernetes
从零开始,在 Kubernetes 上玩转 Erda(二)
本章节介绍 Erda 的部署以及配置细节
1983 0
从零开始,在 Kubernetes 上玩转 Erda(二)
|
存储 算法 C++
【C++】vector介绍以及模拟实现(超级详细)
【C++】vector介绍以及模拟实现(超级详细)
231 4
|
分布式计算 DataWorks 大数据
MaxCompute操作报错合集之在开发环境代码运行没问题,生产环境运行报错,是什么导致的
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
311 0
|
算法 Java
JVM GC 垃圾回收
【1月更文挑战第3天】JVM GC 垃圾回收
|
网络安全 开发工具 数据安全/隐私保护
Git - 记一次完整的新旧Gitlab迁移
Git - 记一次完整的新旧Gitlab迁移
738 0