如何优化C#有序数组值配对程序?现有实现存在值缺失问题
三指针法实现有序数组的配对填充
针对三个升序int数组的配对需求,三指针法是最优解——时间复杂度O(n)(n为三个数组总元素数),逻辑清晰还能彻底解决元素遗漏(比如之前的7)问题。核心思路是利用数组升序的特性,每次定位当前要处理的最小目标值,逐个检查三个数组是否包含该值:存在则取元素并移动指针,不存在则填null。
代码实现
using System; using System.Collections.Generic; class Program { static void Main() { int[] X = { 1, 2, 3, 5, 6, 7 }; int[] Y = { 1, 2, 4, 5, 6, 7 }; int[] Z = { 1, 2, 4, 6, 7 }; var result = new List<Tuple<int?, int?, int?>>(); int i = 0, j = 0, k = 0; int lenX = X.Length, lenY = Y.Length, lenZ = Z.Length; // 只要有一个数组未遍历完,就继续处理 while (i < lenX || j < lenY || k < lenZ) { // 确定当前要处理的最小目标值(兼容指针越界情况) int currentMin = int.MaxValue; if (i < lenX) currentMin = Math.Min(currentMin, X[i]); if (j < lenY) currentMin = Math.Min(currentMin, Y[j]); if (k < lenZ) currentMin = Math.Min(currentMin, Z[k]); // 匹配目标值并移动对应指针 int? xVal = (i < lenX && X[i] == currentMin) ? X[i++] : null; int? yVal = (j < lenY && Y[j] == currentMin) ? Y[j++] : null; int? zVal = (k < lenZ && Z[k] == currentMin) ? Z[k++] : null; result.Add(Tuple.Create(xVal, yVal, zVal)); } // 打印验证结果 foreach (var tuple in result) { Console.WriteLine($"({tuple.Item1 ?? "null"}, {tuple.Item2 ?? "null"}, {tuple.Item3 ?? "null"})"); } } }
关键逻辑说明
- 指针定位:三个指针
i/j/k分别对应三个数组的遍历位置,初始均为0。 - 目标值选取:每次取三个指针当前指向的有效元素(未越界)中的最小值,确保结果始终有序。
- 元素匹配与指针移动:对每个数组,若当前元素等于目标值,则取该元素并将指针后移;否则填充
null。 - 循环终止:当三个指针都遍历完各自数组时停止,此时所有出现过的唯一值都已处理完毕。
运行输出结果
(1, 1, 1) (2, 2, 2) (3, null, null) (null, 4, 4) (5, 5, null) (6, 6, 6) (7, 7, 7)
内容的提问来源于stack exchange,提问作者hi there
相关产品推荐
相关产品推荐

