在线编译器 C

#include <stdio.h> void print_min_sum_indices(int n, int a[]) { int min = a[0]+a[1]; int i1 = 0, i2 = 1; int i, j; for (i = 0; i < n; i++) { for (j = i + 1; j < n; j++) { int sum = a[i] + a[j]; if (sum < min || (sum == min && (i < i1 || (i == i1 && j < i2)))) { min = sum; i1 = i; i2 = j; } } } printf("%d %d", i1, i2); }
这段代码的功能是:在整数数组中找到和最小的两个不同元素的下标,如果有多个相同的最小和,则选择下标字典序最小的那一对(即先比较第一个下标,再比较第二个下标)。

代码逻辑基本正确,但有一个潜在问题需要注意:

- 初始化 `min` 为 `a[0] + a[1]` 时,如果数组长度 `n` 小于 2,会导致访问越界。虽然题目可能保证 `n >= 2`,但这是一个常见的边界情况。

- 在比较条件中,`sum == min && (i < i1 || (i == i1 && j < i2))` 的逻辑是正确的,但可以思考一下:当 `sum == min` 时,是否真的需要同时比较 `i` 和 `j`?因为循环中 `i` 和 `j` 是递增的,所以第一个找到的最小和已经满足下标最小,后续的相等情况其实不会出现更小的下标对。你可以验证一下这个观察是否正确。