整数对最小和-华为OD

给定两个升序排列的整数数组array1和array2,需要找出k对元素使得它们的和最小。输入包含数组大小及元素,输出最小的k对元素和。问题涉及数组操作和算法设计。

题目描述

给定两个整数数组,array1、array2,数组元素按升序排列;
假设从array1、array2中分别取出一个元素,可构成一对元素;
现在需要取出k对元素,并对取出的所有元素求和,计算和的最小值;
注意:两对元素对应array1、array2的下标是相同的,视为同一对元素。

输入描述

输入两行数组array1、array2
每行首个数字为数组大小size, 0 < size <= 100
array1,array2中的每个元素e, 0< e <1000
接下来一行,正整数k 0 < k <= arr1.size * arr2.size

输出描述

满足要求的最小值

示例
输入:
3 1 1 2
3 1 2 3
2
输出: 4
public static void main(String[] args) {
   
   
        
### 华为OD统一考试整数最小问题解法 #### 题目描述 给定两个已排序的数组 `A` `B`,以及一个正整数 `k`。要求找到所有可能的 `(Ai, Bj)` 对中的前 `k` 小的,并返回这些的总[^2]。 #### 解题思路 此问题可以通过 **贪心算法** 或者 **优先队列(最小堆)** 来解决。核心思想是从两数组中选取元素组成最小的配对组合。由于输入数组已经有序,因此可以利用这一特性减少不必要的计算量。具体方法如下: 1. 利用最小堆来维护当前可选的最小候选集合。 2. 初始化时,将第一个数组的所有元素与第二个数组的第一个元素组成的加入堆中。 3. 每次从堆中取出最小的一个,将其计入结果并尝试扩展新的候选项到堆中。 4. 继续上述过程直到取出了所需的 `k` 个最小为止。 这种方法的时间复杂度主要由堆的操作决定,通常为 \( O(k \log m) \),其中 \( m \) 是较小的那个数组长度[^3]。 #### Python 实现代码 以下是基于 Python 的一种实现方式: ```python import heapq def find_k_min_sum(a1, a2, k): n1, n2 = len(a1), len(a2) min_heap = [] # 初始化堆,只考虑 array1 前 k 个元素与 array2 第一个元素的组合 for i in range(min(k, n1)): heapq.heappush(min_heap, (a1[i] + a2[0], i, 0)) result_sum = 0 count = 0 while count < k and min_heap: sum_val, i, j = heapq.heappop(min_heap) result_sum += sum_val count += 1 if j + 1 < n2: # 扩展新组合进入堆 heapq.heappush(min_heap, (a1[i] + a2[j + 1], i, j + 1)) return result_sum ``` #### Java 实现代码 下面是使用 Java 中的 `PriorityQueue`
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值