diff --git a/408/《数据结构》综合应用题.md b/408/《数据结构》综合应用题.md index ba627fb..a635fec 100644 --- a/408/《数据结构》综合应用题.md +++ b/408/《数据结构》综合应用题.md @@ -40,7 +40,7 @@ int IsExistEL(MGraph G){ // 空间复杂度:O(1)。 ``` -## [2021-42] +## [2021 - 42] 已知某排序算法如下: @@ -70,7 +70,7 @@ void cmpCountSort(int a[], int b[], int n){ 2. $\frac{n * (n - 1)}{2}$ 3. 不是,不能保证两元素相同时,先出现的元素在前,应改为 `if (a[i] <= a[j]) count[j]++;` -## [2020-41] +## [2020 - 41] 定义三元组 $(a, b, c)$(其中 $a, b, c$ 均为正数)的距离 $D = |a - b| + |b - c| + |c - a|$。给定 3 个非空整数集合 $S_1$、$S_2$ 和 $S_3$,按升序分别存储在 3 个数组中。设计一个尽可能高效的算法,计算并输出所有可能的三元组 $(a, b, c) (a \in S_1, b \in S_2, c \in S_3)$ 中的最小距离。例如 $S_1 = \{-1, 0, 9\}, S_2 = \{-25, -10, 10, 11\}, S_3 = \{2, 9, 17, 30, 41\}$,则最小距离为 2,相应的三元组为 $\{9, 10, 9\}$。要求: @@ -80,3 +80,33 @@ void cmpCountSort(int a[], int b[], int n){ --- +不妨设 a <= b <= c,不难看出 D 的大小关键是 a 和 c 之间的距离,于是问题就可以简化为每次固定 c 找一个 a 使得 L3。 + +```cpp +#define INT_MAX 0x7fffffff + +int Abs(int a){ // 计算绝对值 + if (a < 0) return -a; + else return a; +} + +bool IsMin(int a, int b, int c){ // a 是否是三个数中最小值 + if (a <= b && a <= c) return true; + else return false; +} + +int Ans(int a[], int la, int b[], int lb, int c[], int lc){ + int i = 0, j = 0, k = 0, D_min = INT_MAX, D; // D_min 用于记录三元组最小距离,初始赋为 INT_MAX + while (i < la && j < lb && k < lc && D > 0){ + D = Abs(a[i] - b[j]) + Abs(b[j] - c[k]) + Abs(c[k] - a[i]); // 计算 D + if (D < D_min) D_min = D; // 更新 D + if (IsMin(a[i], b[j], c[k])) i++; // 更新 a + else if(IsMin(b[j], a[i], c[k])) j++; + else k++; + } + return D_min; +} +``` + +时间复杂度:$O(n)$ +空间复杂度:$O(1)$ \ No newline at end of file