报告错误
如果你发现该网页中存在错误/显示异常,可以从以下两种方式向我们报告错误,我们会尽快修复:
- 使用 CS Club 网站错误 为主题,附上错误截图或描述及网址后发送邮件到 286988023@qq.com
- 在我们的网站代码仓库中创建一个 issue 并在 issue 中描述问题 点击链接前往Github仓库
题目大意
题目会给两组数 A, B. 长度分别为 N, M. 要找到两组数中最小的差 \(1\leqslant N,M \leqslant 2 \times 10^5 \\1 \leqslant A_i \leqslant 10^9 \\1 \leqslant B_i \leqslant 10^9\)
解题思路
从数据大小可以看出,直接暴力枚举会超时–O(n^2)
可以先把两组数据排序 : B(n+1)>Bn , A(n+1)>An
排序 :复杂度:O(nlogn)
如果当Bn>A时,Bn-An 会比 Bn-A(n+1) 差的多 所以直接看A(n+1)
当An>B时,同理 可以直接看B(n+1)
遍历一遍: 复杂度:O(n)
总的复杂度–O(nlogn)
代码
import java.util.*;
public class minDifference {
public static void main (String[] args) {
Scanner in = new Scanner (System.in);
int N = in.nextInt();
int M = in.nextInt();
int[] a = new int[N];
int[] b = new int[M];
for(int n = 0; n < N; n++) a[n] = in.nextInt();
for(int m = 0; m < M; m++) b[m] = in.nextInt();
Arrays.sort(a);
Arrays.sort(b);
int ans =Integer.MAX_VALUE;
int i = 0;
int j = 0;
while(i < N && j < M) {
ans = Math.min(ans, Math.abs(a[i]-b[j]));
if(a[i]<b[j]) i++;
else j++;
}
System.out.println(ans);
}
}