在 C 语言中,int min = INT_MAX; 这行代码的意思是将变量 min 初始化为 int 类型可表示的最大整数值。这里,INT_MAX 是一个在 limits.h 头文件中定义的宏,代表 int 类型能够表示的最大值。
在这个特定的上下文中,这样做的目的是为了在求两个数组元素之间的最小差值时有一个起始的比较值。由于我们要寻找的是最小的差值,初始值应该设置得尽可能大,以确保任何实际计算出的差值都会小于这个初始值。然后,在迭代过程中,每当找到一个小于当前 min 的差值时,就更新 min 的值。
因此,将 min 初始化为 INT_MAX 就是为了确保它一开始被设置为一个足够大的数,使得算法能够正确地找到并更新最小差值。
while (i < m && j < n): 这是一个 while 循环,它会一直执行,直到 i 达到数组 x 的长度 m 或者 j 达到数组 y 的长度 n。这个条件确保了循环在遍历数组时不会越界。
if (x[i] < y[j]) { i++; } else { j++; }: 这部分是双指针技术的核心。它决定了是将指针 i 向前移动还是将指针 j 向前移动。如果 x[i] 小于 y[j],则意味着增加 i(即考虑 x 的下一个元素)可能会找到更小的差值。反之,如果 x[i] 大于或等于 y[j],则增加 j
初始时,两个指针分别指向两个数组的起始位置。
比较这两个指针指向的元素,计算它们之间的差的绝对值,并检查这是否是当前找到的最小值。
根据两个指针所指元素的比较结果,移动其中一个指针(若第一个数组的当前元素小于第二个数组的当前元素,则移动第一个数组的指针;否则,移动第二个数组的指针)。
重复上述过程,直到任一指针越界。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
int main() {
int n, m, i, j, z;
// 读取两个数组的长度 m 和 n
scanf("%d%d", &m, &n);
// 声明两个数组 x 和 y
int x[1000];
int y[1000];
// 读取第一个数组 x 的元素
for (i = 0; i < m; i++) {
scanf("%d", &x[i]);
}
// 读取第二个数组 y 的元素
for (i = 0; i < n; i++) {
scanf("%d", &y[i]);
}
// 初始化 min 为 INT_MAX,代表可能的最大整数,用于记录最小差值
int min = INT_MAX;
// 初始化双指针 i 和 j
i = 0, j = 0;
// 使用双指针遍历两个数组,寻找最小的绝对差
while (i < m && j < n) {
// 计算当前指针所指元素的绝对差
int ret = abs(x[i] - y[j]);
// 更新最小差值
if (ret < min) {
min = ret;
}
// 根据元素大小移动指针
if (x[i] < y[j]) {
i++;
} else {
j++;
}
}
// 打印最小差值
printf("%d", min);
return 0;
}0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复