AC110-三递增序列公共元素查找¶
代码实现¶
代码逻辑解析¶
- 初始化指针:
i,j,k分别指向数组A,B,C的起始位置(即索引为 0 的位置)。-
这些指针用于遍历各自的数组。
-
循环条件:
-
当三个指针均未超出数组范围时,继续执行循环。
-
判断是否找到公共元素:
- 如果
A[i] == B[j] && A[i] == C[k],说明当前三个指针指向的元素相同,这是一个公共元素。 -
输出该公共元素后,将三个指针同时向后移动一位。
-
未找到公共元素时的处理:
- 调用
fmax函数,找到当前三个指针指向的元素中的最大值max_num。 - 对于每个数组,如果其当前指针指向的元素小于
max_num,则将该指针向前移动一位。 - 这样可以逐步使三个指针指向更接近的值,从而提高效率。
时间复杂度分析¶
- 循环次数:
- 每次循环至少会移动一个指针,因此总的循环次数最多为
3n(每个指针最多移动n次)。 -
因此,时间复杂度为 O(n)。
-
函数调用:
fmax函数的时间复杂度为 O(1),因为它只涉及简单的比较操作。- 整体来看,
fmax的调用不会显著增加时间复杂度。
综上,算法的时间复杂度为 O(n)。
空间复杂度分析¶
- 该算法只使用了常量级别的额外空间(如变量
i,j,k,max_num),没有使用与输入规模相关的额外空间。 - 因此,空间复杂度为 O(1)。
较难理解部分的说明¶
为什么每次只需要移动指向较小元素的指针?¶
- 由于三个数组均为无重复元素的递增序列,因此如果某个指针指向的元素小于其他两个指针指向的元素,那么它不可能是公共元素。
- 通过移动指向较小元素的指针,可以使三个指针更快地靠近潜在的公共元素,从而提高效率。
图解说明¶
假设三个数组如下:
初始状态:
- 第一次循环:
max_num = 3,移动i和j。 - 第二次循环:
max_num = 3,此时A[i] == B[j] == C[k],输出3,并移动i,j,k。
最终输出结果为 3。
延伸知识点¶
- 多指针法的应用:
- 多指针法常用于解决多个有序数组的问题,例如查找交集、合并排序等。
-
其核心思想是利用数组的有序性,通过移动指针快速缩小搜索范围。
-
边界条件的处理:
- 在实际应用中,需要特别注意数组为空或长度不一致的情况。
-
此外,还需考虑是否存在重复元素的场景。
-
扩展问题:
- 如果数组不是严格递增的(允许重复元素),如何修改算法?
- 如果有更多数组(如四个或五个),如何推广该算法?