Math 如何在给定范围的列表中找到一对数字?
问题在于: 给定一个由N个数字组成的数组,在数组中找到两个数字,使它们的范围(max-min)值K 例如: 输入: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
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