问题描述
1200: 数组的距离
时间限制: 1 Sec 内存限制: 128 MB
提交: 4215 解决: 2461
已知元素从小到大排列的两个数组x[]和y[],请写出一个程序
算出两个数组彼此之间差的绝对值中最小的一个,这叫做数组的距离
输入
第一行为两个整数m, n(1≤m, n≤1000),分别代表数组f[], g[]的长度。
第二行有m个元素,为数组f[]。
第三行有n个元素,为数组g[]。
输出
数组的最短距离
样例输入 Copy
5 5
1 2 3 4 5
6 7 8 9 10
样例输出 Copy
1
样例输入 Copy
5 5
1 5 10 15 20
7 9 12 13 20
样例输出 Copy
0
代码&注释
完整代码
#include <iostream>
using namespace std;
int getArrDist(int *arr1, int *arr2, int m, int n);
int getArrDist2(int *a, int *b, int m, int n);
int absValue(int num);
int main() {
int m, n;
int *arr1, *arr2;
cin >> m >> n;
arr1 = new int[m];
arr2 = new int[n];
for (int i = 0; i < m; i++) {
cin >> arr1[i];
}
for (int i = 0; i < n; i++) {
cin >> arr2[i];
}
int res = getArrDist2(arr1, arr2, m, n);
cout << res << endl;
delete [] arr1;
delete [] arr2;
return 0;
}
int getArrDist(int *arr1, int *arr2, int m, int n) {
//sortIntArr(arr1);
//sortIntArr(arr2);
// int len1 = m;
// int len2 = n;
int res = absValue(arr1[0] - arr2[0]);
if (res == 0) return 0;
int temp;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
temp = absValue(arr1[i] - arr2[j]);
if (temp == 0) return 0;
if (temp < res)
res = temp;
}
}
return res;
}
int getArrDist2(int *a, int *b, int m, int n) {
int min = absValue(a[0] - b[0]);
int i = 0, j = 0;
while (1) {
if (absValue(a[i] - b[j + 1]) < min && j + 1 < n) // && i < m
{
min = absValue(a[i] - b[j + 1]);
j++;
}
else if (absValue(a[i + 1] - b[j]) < min && i + 1 < m) // && j < n
{
min = absValue(a[i + 1] - b[j]);
i++;
}
else if (i < m - 1 && j < n - 1)
{
i++;
j++;
if (absValue(a[i] - b[j]) < min)
min = absValue(a[i] - b[j]);
}
else break;
}
return min;
}
int absValue(int num) {
if (num < 0) return -num;
return num;
}
方法一
直接遍历计算得到差值,与上一次的插值做比较,从而得到最小距离
int getArrDist(int *arr1, int *arr2, int m, int n) {
//sortIntArr(arr1);
//sortIntArr(arr2);
// int len1 = m;
// int len2 = n;
int res = absValue(arr1[0] - arr2[0]);
if (res == 0) return 0;
int temp;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
temp = absValue(arr1[i] - arr2[j]);
if (temp == 0) return 0;
if (temp < res)
res = temp;
}
}
return res;
}
方法二
通过 if 判断来决定是先移动到 a 数组下一位,还是 b 数组的下一位,或者同时移动两数组到它们的下一位。每一次循环都要进行 if 判断,从而决定下一步的操作。
int getArrDist2(int *a, int *b, int m, int n) {
int min = absValue(a[0] - b[0]);
int i = 0, j = 0;
while (1) {
if (absValue(a[i] - b[j + 1]) < min && j + 1 < n) // && i < m
{
min = absValue(a[i] - b[j + 1]);
j++;
}
else if (absValue(a[i + 1] - b[j]) < min && i + 1 < m) // && j < n
{
min = absValue(a[i + 1] - b[j]);
i++;
}
else if (i < m - 1 && j < n - 1)
{
i++;
j++;
if (absValue(a[i] - b[j]) < min)
min = absValue(a[i] - b[j]);
}
else break;
}
return min;
}
总结
向大佬学习!学习大佬的代码,思考方式,算法思维,代码实现。。。。