如何高效检测二元数组(含逆序)是否存在于两数组生成的交叉组合数组中?
解决方案:判断二元数组是否存在于交叉组合数组(顺序不限)
核心思路
不用先生成完整的$selections数组再做匹配,直接基于原数组$a和$b的生成规则做校验,既节省内存又更简洁:
- 当
$result两个元素相同时:需满足该元素同时存在于$a和$b(匹配业务中[3,3]算存在的规则) - 当
$result两个元素不同时:需满足「第一个元素在$a且第二个在$b」或者「第一个元素在$b且第二个在$a」
简洁实现代码
function isResultExists($result, $a, $b) { $x = $result[0]; $y = $result[1]; // 处理两元素相同的场景 if ($x === $y) { return in_array($x, $a) && in_array($x, $b); } // 处理两元素不同的场景,两种顺序都校验 return (in_array($x, $a) && in_array($y, $b)) || (in_array($x, $b) && in_array($y, $a)); }
验证示例
用题目给出的$a = [1, 2, 3]、$b = [3, 4, 5]测试:
应返回存在(true)的情况
isResultExists([1, 3], $a, $b)isResultExists([3, 1], $a, $b)isResultExists([2, 5], $a, $b)isResultExists([3, 3], $a, $b)
应返回不存在(false)的情况
isResultExists([1, 2], $a, $b)isResultExists([4, 4], $a, $b)
注:题目中「存在」和「不存在」列表同时出现
[3,3],推测是笔误,此处按业务逻辑中「存在」的规则处理。
方案优势
先生成$selections会占用额外内存,尤其是当$a和$b元素较多时,直接基于原数组校验的方式时间复杂度更低,代码也更精简,无需维护额外的组合数组。
内容的提问来源于stack exchange,提问作者Pol Santha
相关产品推荐
相关产品推荐

