如何判断升序排序后的数组是否完全包含于另一数组?
判断排序后数组是否完全包含于目标数组的方案
针对你提出的需求——验证排序后的ints数组所有元素都存在于i数组中(只要有一个元素不在就返回false,和判断元素重叠的逻辑不同),这里提供两种实用的实现方案:
方案一:Linq简洁实现(不考虑元素重复次数)
如果只需要验证元素是否存在,不需要关心元素出现的次数,直接用Linq的All方法配合Contains就能快速实现,代码非常直观:
// 排序后的ints数组 int[] sortedInts = { 2, 4, 5, 6 }; // 目标数组i int[] targetArray = { 1, 2, 4, 5, 6, 8, 12 }; // 判断sortedInts的所有元素都在targetArray中 bool isFullyContained = sortedInts.All(x => targetArray.Contains(x));
当sortedInts包含3这类不在targetArray中的元素时,这个表达式会直接返回false,完全符合需求。不过这种方法的时间复杂度是O(m*n)(m是sortedInts长度,n是targetArray长度),适合处理小规模数组。
方案二:双指针高效实现(支持重复元素校验)
如果两个数组都是有序的(你的场景里sortedInts已经排序,targetArray本身也是有序的),用双指针法效率更高,还能正确校验元素的重复次数(比如sortedInts有两个2,但targetArray只有一个2时,会返回false):
int[] sortedInts = { 2, 4, 5, 6 }; int[] targetArray = { 1, 2, 4, 5, 6, 8, 12 }; int p1 = 0, p2 = 0; bool isFullyContained = true; while (p1 < sortedInts.Length && p2 < targetArray.Length) { if (sortedInts[p1] == targetArray[p2]) { // 找到匹配元素,同时移动两个指针 p1++; p2++; } else if (sortedInts[p1] < targetArray[p2]) { // 当前sortedInts的元素比target的小,说明target里没有这个元素 isFullyContained = false; break; } else { // target的元素更小,移动target指针继续查找 p2++; } } // 如果sortedInts还有元素没遍历完,说明存在未匹配的元素 if (p1 < sortedInts.Length) { isFullyContained = false; } // 输出结果 Console.WriteLine(isFullyContained);
这种方法的时间复杂度是O(m+n),在处理大数组时性能优势明显,同时能覆盖更严谨的校验场景。
内容的提问来源于stack exchange,提问作者Loch
相关产品推荐
相关产品推荐

