算法--06年华为面试:求两个数组的最小差值(Java实现)

本文介绍了华为2006年面试题,要求8分钟内解决两个数组找最小差值的问题。错误逻辑包括简单合并排序和交错分配。正确解法是遍历数组进行交换并计算差值,虽然计算量大,但能找到最小差值。此外,还提及了背包算法在解决此类问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Q题目

华为06年面试题(要求8分钟完成)

有两个数组a,b,大小都为n,数组元素的值任意,无序; 

要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小。

A解法

1.常见错误逻辑

  • 错误逻辑一:将两个数组合并为一个数组,进行排序,将前面n个小的作为数组a,后面n作为数组b,a减b得到值,即为最小值。【该思路对题意理解有误,这里求最小差值,指的是绝对值】

  • 错误逻辑二:同样是将两个数组合并,然后排序,此时采用交错的取法,分配给两个数组a和b,比如1,2,3,4,将1和3分给a,2和4非配给b【明显是错误的】。还有人采用更加严谨一些的方法,就是没次交错给两个数组非配值前,比较一下两个数组和的大小,给小的分配大值,此时1,2,3,4的分配结果是- - a数组为:1 , 4 - - b数组为:2 , 3 。貌似是正确的,但假如最大数非常大,大到比剩余所有数字的总和还大呢?此时应该是将前面(n-1)个最小值与最大值组合在一起。


2.最小差值算法

2.1逻辑分析

大概逻辑:将数组a的每一个数依次去与数组b中的每个数,进行交换,每次交换完成后分别计算两个数组的差值(minus),如果差值变大则,不交换,差值变小则交换。此时时间复杂度为O(n!)

详细分析:
1)数组a的第一个数与数组b第一个数进行交换,交换后两数组差值变小,则不做改变了,若变大了,则重新交换回来
2)在上一步基础上,再用数组a的第一个数(可能是a[0],也可能交换后的b[0])去与数组b的第二个数进行交换,差值变小,则不作改变,变大,则重新换回来,依次进行比较
3)数组a的第一个数与数组b中的所有数进行交换处理后,采用同样的方法,再用数组a的第二个数与数组b中的所有数依次进行交换,在比较差值来处理

缺点:计算量大,有许多重复的计算

2.2实现代码如下

package 华为面试两数组最小差值;

import java.util.Arrays;

public class Test2 {
    public static void main(String[] args) {
        //1.测试数组a和b
//      int a[] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 989 };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值