Math 如何在给定范围的列表中找到一对数字?

Math 如何在给定范围的列表中找到一对数字?,math,search,range,Math,Search,Range,问题在于: 给定一个由N个数字组成的数组,在数组中找到两个数字,使它们的范围(max-min)值K 例如: 输入: 5 3 25 9 1 6 8 输出: 9 6 到目前为止,我尝试的是首先对数组进行排序,然后使用嵌套循环查找两个互补数。然而,因为这是一种蛮力方法,我认为它不如其他可能的方法有效 import java.util.*; public class Main { public static void main(String[] args) { Scann

问题在于:

给定一个由N个数字组成的数组,在数组中找到两个数字,使它们的范围(max-min)值K

例如:

输入:

5 3
25 9 1 6 8
输出:

9 6
到目前为止,我尝试的是首先对数组进行排序,然后使用嵌套循环查找两个互补数。然而,因为这是一种蛮力方法,我认为它不如其他可能的方法有效

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), k = sc.nextInt();
        int[] arr = new int[n];
        for(int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        Arrays.sort(arr);
        int count = 0;
        int a, b;
        for(int i = 0; i < n; i++) {
            for(int j = i; j < n; j++) {
                if(Math.max(arr[i], arr[j]) - Math.min(arr[i], arr[j]) == k) {
                    a = arr[i];
                    b = arr[j];
                }
            }
        }
        System.out.println(a + " " + b);
    }
}

import java.util.*;
公共班机{
公共静态void main(字符串[]args){
扫描仪sc=新的扫描仪(System.in);
int n=sc.nextInt(),k=sc.nextInt();
int[]arr=新的int[n];
对于(int i=0;i

如果解决方案是用代码(任何语言)编写的,我们将不胜感激。

这里是用Python 3编写的代码,可以解决您的问题。这应该很容易理解,即使您不懂Python

这个例程使用您对数组进行排序的想法,但我使用了两个变量
left
right
(它们定义了数组中的两个位置),其中每个变量只通过数组一次。因此,除了排序之外,我的代码的时间效率是
O(N)
。排序使整个例程
O(N log N)
。这比您的代码要好,它是
O(N^2)

我从不使用输入值
N
,因为Python可以轻松处理数组的实际大小。我在数组的末尾添加一个sentinel值,以使内部短循环更简单、更快。这涉及到另一次通过数组来计算sentinel值,但这几乎不会增加运行时间。减少数组访问的数量是可能的,但代价是增加几行代码——我将把这留给您。我添加了输入提示以帮助我的测试——您可以删除这些提示以使我的结果更接近您想要的结果。我的代码首先打印两个数字中的较大值,然后打印与示例输出相匹配的较小值。但您可能希望两个数字的顺序与原始未排序数组中的顺序匹配——如果是这样,我也会让您处理(我看到了多种方法)

#获取输入
N、 K=[int(s)表示输入中的s('input N和K:')。split()]
arr=[int(s)表示输入中的s('输入数组:')。split()]
arr.sort()
哨兵=最大(arr)+K+2
arr.append(哨兵)
左=右=0
而arr[右]<哨兵:
#移动正确的索引,直到差异过大
当arr[右]-arr[左]K时:
左+=1
#检查我们是否完成了
如果arr[右]-arr[左]==K:
打印(arr[右]、arr[左])
打破
# Get input
N, K = [int(s) for s in input('Input N and K: ').split()]
arr = [int(s) for s in input('Input the array: ').split()]

arr.sort()
sentinel = max(arr) + K + 2
arr.append(sentinel)
left = right = 0
while arr[right] < sentinel:
    # Move the right index until the difference is too large
    while arr[right] - arr[left] < K:
        right += 1
    # Move the left index until the difference is too small
    while arr[right] - arr[left] > K:
        left += 1
    # Check if we are done
    if arr[right] - arr[left] == K:
        print(arr[right], arr[left])
        break