`
MouseLearnJava
  • 浏览: 467403 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

给定两个有序数组和一个指定的sum值,从两个数组中各找一个数使得这两个数的和与指定的sum值相差最小

阅读更多

 

题目:给定两个有序数组和一个指定的sum值,从两个数组中各找一个数使得这两个数的和与指定的sum值相差最小。

比如,有两个有序数组,数组1 为{ -5, -1, 0, 1, 4, 5, 7, 9 }数组2 为{ -3, 3, 10, 12, 15, 18, 21, 28 },如果 sum 为20,

则获得的结果为[-1 , 21],如sum为30,则与sum相差最小的两个数为[7 , 28] 。

解决该题目的方法可以采用如下的步骤:

1. 定义两个索引变量,  leftIndex为数组1的索引值,初始值为0,rightIndex为数组2的索引,初始值为数组2的长度减一。定义一个差值diff,初始值为 Integer.MAX_VALUE

2.  while (leftIndex < lenOne && rightIndex >= 0)  则执行相关的逻辑,此处分三种情况

  •      if (Math.abs(arrayOne[leftIndex] + arrayTwo[rightIndex]- expectedSum) < diff)  则更新diff和数组一和数组二中期望的两个数的值
  •      else if (arrayOne[leftIndex] + arrayTwo[rightIndex] < expectedSum)  则数组一的leftIndex++
  •      else 其它情况下,数组二的下标rightIndex–

3.  while循环结束,输出期望的值。

有了这个思想,我们可以编写如下的程序了。

public class FindClosestPairExample {
 
    public static void findAndPrintClosest(int[] arrayOne, int[] arrayTwo,
            int expectedSum) {
        int lenOne = arrayOne.length;
        int lenTwo = arrayTwo.length;
        int diff = Integer.MAX_VALUE;
        int resultOne = 0;
        int resultTwo = 0;
        int leftIndex = 0;
        int rightIndex = lenTwo - 1;
 
        while (leftIndex < lenOne && rightIndex >= 0) {
            if (Math.abs(arrayOne[leftIndex] + arrayTwo[rightIndex]
                    - expectedSum) < diff) {
                resultOne = arrayOne[leftIndex];
                resultTwo = arrayTwo[rightIndex];
                diff = Math.abs(resultOne + resultTwo - expectedSum);
            } else if (arrayOne[leftIndex] + arrayTwo[rightIndex] < expectedSum) {
                leftIndex++;
            } else {
                rightIndex--;
            }
        }
 
        System.out.printf("[%d , %d] \n", resultOne, resultTwo);
    }
 
}

测试代码如下:

public static void main(String[] args) {
        int[] arrayOne = { -5, -1, 0, 1, 4, 5, 7, 9 };
        int[] arrayTwo = { -3, 3, 10, 12, 15, 18, 21, 28 };
        System.out.println("两个有序数组的内容为:");
        System.out.println("数组一:" + Arrays.toString(arrayOne));
        System.out.println("数组二:" + Arrays.toString(arrayTwo));
 
        System.out.println("与期望值20相差最小的两个数为:");
        findAndPrintClosest(arrayOne, arrayTwo, 20);
        System.out.println("与期望值35相差最小的两个数为:");
        findAndPrintClosest(arrayOne, arrayTwo, 35);
 
    }

程序运行结果:

两个有序数组的内容为:
数组一:[-5, -1, 0, 1, 4, 5, 7, 9]
数组二:[-3, 3, 10, 12, 15, 18, 21, 28]
与期望值20相差最小的两个数为:
[-1 , 21] 
与期望值35相差最小的两个数为:
[7 , 28] 

原文地址http://thecodesample.com/?p=855

 

更多例子请访问 http://thecodesample.com/

0
0
分享到:
评论

相关推荐

    两数之和 II - 输入有序数组1

    这个问题来源于 LeetCode 平台,要求在一个已排序的整数数组 `numbers` 中找到两个数,使得它们的和等于给定的目标数 `target`,并返回这两个数的下标,且下标必须满足 1 [0] [3] 。 首先,我们需要理解输入参数: ...

    两数之和 II - 输入有序数组python1

    给定一个整数数组 `numbers` 和一个目标值 `target`,我们的任务是找到数组中两个数的下标,使得它们相加等于 `target`。返回的结果是一个包含两个整数的列表,表示这两个数的下标。下标是从1开始的,且答案必须满足...

    找出数组3个数字相加为0的组合

    在本问题中,我们面临的是一个经典的算法挑战:找出数组中三个数字的组合,使得它们的和为零。这个题目属于计算机科学中的“三数之和”问题,通常在算法设计和面试中出现,旨在考察候选人的逻辑思维和解决复杂问题的...

    常见数组面试题

    **题目描述:** 给定两个有序数组,找出它们共有的元素。 **解答:** ```cpp void FindCommon(int* a, int* b, int n) { int i = 0, j = 0; while (i ) { if (a[i] [j]) { ++i; } else if (a[i] == b[j]) { ...

    LeetCode 167. 两数之和 II – 输入有序数组(双指针)

    在给定的有序数组中寻找两个数,使它们的和等于特定的目标值,并返回这两个数的索引值。关键在于,数组已经按升序排列,这意味着可以通过两个指针从数组的两端开始向中间移动来有效地找到解决方案。 **问题描述:**...

    leetcode167-LeetCode167_Two-Sum-II:给定一个目标target,再数组中找到两个数,使其和为target,并返

    这个挑战要求我们在已排序的数组中寻找两个元素,它们的和等于给定的目标值`target`,并返回这两个元素的索引,索引是从1开始的。 ### 一、问题分析 这是一个典型的搜索问题,由于数组已经排序,我们可以利用这一...

    关于数组的几道面试题1

    对于两个有序数组,可以采用双指针法,分别从头开始比较,找到相同的元素。 7. **求三个数组的共同元素**: 可以先找出两个数组的交集,再找这个交集与其他数组的交集。 8. **找出数组中唯一的重复元素**: ...

    php数组的一些常见操作汇总

    下面将详细介绍数组操作的几个方面,包括数组求和、求数组的最大值和最小值、求数组的最大值和次大值以及找出数组中出现次数超过一半的元素。 首先,我们来看数组求和。在数组中求和的问题,虽然简单,但是通过递归...

    使用数组的程序设计

    在给定的C语言代码中,首先定义了一个5x5的二维整型数组`a`,用来存储幻方矩阵的元素。接着,通过两个循环分别计算行和列的和(`sum1`和`sum2`),以及主对角线和副对角线的和(`b`)。通过比较这些和来验证矩阵是否...

    coding-interview-in-java.pdf

    - 给定两个排序数组,找出它们的中位数。这是一个涉及到两个数组的合并和查找的问题。 19. FindMinimuminRotatedSortedArray - 在旋转排序数组中找到最小元素,要求算法的时间复杂度为O(log n)。这是对二分查找...

    leetcode-master.zip

    4. "004_median_of_two_sorted_arrays":这个题目是“寻找两个有序数组的中位数”。需要在两个已排序的数组中找到中位数,如果两个数组合并后的数组有偶数个元素,中位数就是中间两个数的平均值。这个问题通常用二分...

    _leetcode-python.pdf

    - Two Sum: 题目要求从数组中找到两个数使得它们的和等于一个特定值。这通常需要使用哈希表来降低时间复杂度。 - Add Two Numbers: 输入是两个非空的链表,表示两个非负整数,它们以相反的顺序存储。需要正确地相加...

    php数组——记忆卡

    每个数组元素都由一个键(key)和一个值(value)组成。键用来唯一标识数组中的元素,并且可以通过键来访问该元素的值。 ##### 2. 创建数组 在PHP中,可以通过不同的方式来创建数组: - **简单格式**: ```php ...

    twoSum0.zip

    两数之和问题通常描述为:给定一个整数数组和一个目标值,我们需要找到数组中两个元素的索引,使得它们相加等于目标值。这个问题在算法领域属于数组和哈希表的基础应用,通常使用哈希表来解决,因为它具有高效的查找...

    数据结构与算法题解

    - 找出两个有序数组的中位数。 - **Sqrtx** - 求一个数的平方根。 - **WoodCut** - 木材切割问题。 **4. 数学与位操作(MathandBitManipulation)** - **SingleNumber** - 找出数组中只出现一次的数字。 - **...

    PHP获取数组最大值下标的方法

    数组是一个有序的数据集合,每个元素都有一个唯一的键(或索引)和对应的值。在某些场景下,我们可能需要找出数组中值最大的元素,并获取其键,这在统计分析或数据排序时尤为有用。 首先,让我们看一段实例代码来...

    php参考手册.pdf

    3. `array_combine()`:结合两个数组,一个作为键,另一个作为值,创建一个新的关联数组。 4. `array_count_values()`:统计数组中每个唯一值出现的次数,返回一个包含计数值的新数组。 5. `array_diff()`、`array_...

    maxsum.rar_最大子段和

    该问题旨在寻找一个数组或序列中的连续子序列,使得这个子序列的元素之和最大。这个问题不仅在理论上有其学术价值,而且在实际应用中也有广泛的应用,例如在股票交易策略、数据分析和优化问题中。 在描述中提到的...

    Leetcode book刷题必备

    ***o Sum问题:给定一个整数数组和一个目标值,返回两个数的索引,这两个数的和等于目标值。 ***o Sum II – Input Array Is Sorted:当数组已经排序时,如何找到两个数的和等于目标值。 ***o Sum III – Data ...

Global site tag (gtag.js) - Google Analytics