如何高效检查三个数组中是否存在共同的唯一值?
最佳实现方案
最高效的方式是利用Set数据结构的O(1)查找特性,避免数组includes方法的O(n)时间开销。核心思路是:把其中两个数组转成Set,然后遍历最短的那个数组(减少遍历次数),检查每个元素是否同时存在于两个Set中——只要找到第一个符合条件的元素,就可以直接返回true,不用继续遍历。
具体代码实现
function hasCommonElement(localCodes, standardCodes, specialCodes) { // 优先选择最短的数组作为遍历对象,减少循环次数 const arrays = [localCodes, standardCodes, specialCodes]; arrays.sort((a, b) => a.length - b.length); const [shortest, mid, longest] = arrays; // 将后两个数组转为Set,实现O(1)查找 const midSet = new Set(mid); const longestSet = new Set(longest); // 遍历最短数组,检查元素是否同时存在于两个Set中 for (const num of shortest) { if (midSet.has(num) && longestSet.has(num)) { return true; } } return false; } // 测试示例 const localCodes = [1,2,3,4]; const standardCodes = [10,2,11,44]; const specialCodes = [99,98,89,2]; console.log(hasCommonElement(localCodes, standardCodes, specialCodes)); // 输出true
效率说明
- Set的
has方法时间复杂度为O(1),远快于数组includes的O(n)查找 - 遍历最短数组,最大程度减少循环执行次数
- 找到符合条件的元素立即返回,避免不必要的遍历
对比原有代码的优化点
你当前的思路是遍历最长数组,这会增加循环次数;而且如果后续用数组includes做查找,内层操作的时间复杂度是O(n),整体会达到O(n²)。而用Set优化后,整体时间复杂度降到O(n)(n为三个数组中最长的长度),执行效率提升明显。
内容的提问来源于stack exchange,提问作者M. Pollino
相关产品推荐
相关产品推荐

