求数组中重复两次元素的最大距离:O(n*dmax)与O(nlogn)算法需求
问题解答
1. 时间复杂度O(ndmax)*的算法
这个算法采用暴力遍历思路,逐个定位每个元素的配对位置并计算距离:
- 初始化
dmax = 0,同时维护一个标记数组processed(大小为n,初始全为false) - 遍历数组的每个索引
i(从0到n-1):- 如果
processed[i]为true,直接跳过当前元素 - 从
i+1开始向后遍历索引j,直到找到A[j] == A[i] - 计算距离
current_dist = j - i,若current_dist > dmax,将dmax更新为current_dist - 把
processed[i]和processed[j]都设为true,避免重复处理同一元素对
- 如果
- 遍历结束后返回
dmax
时间复杂度分析:最坏情况下,最大距离dmax接近n(例如第一个元素和最后一个元素相同),此时单次查找配对元素需要遍历dmax步;总共有n/2个不同元素,总操作数约为n*dmax/2,对应时间复杂度O(ndmax)*。
2. 时间复杂度*O(nlogn)*的算法
这个算法通过排序聚合相同元素,再计算索引差:
- 首先创建一个辅助数组
pairs,存储每个元素与其原索引的配对,伪代码如下:
pairs = [] for i in 0..n-1: pairs.add( (A[i], i) )
- 对
pairs数组按照元素值(即A[i])进行升序排序,排序后相同元素会连续排列 - 初始化
dmax = 0,遍历排序后的pairs数组,每次处理连续的两个相同元素:- 取出当前元素对的原索引
idx1 = pairs[k][1]和idx2 = pairs[k+1][1] - 计算距离
current_dist = abs(idx2 - idx1),若current_dist > dmax,更新dmax - 步长设为2,跳过已处理的配对元素
- 取出当前元素对的原索引
- 遍历结束后返回
dmax
时间复杂度分析:排序操作的时间复杂度为O(nlogn),后续遍历辅助数组的时间为O(n),整体时间复杂度由排序步骤主导,即O(nlogn)。
你提到的哈希表方法确实是时间复杂度更优的*O(n)*解法,但题目明确要求了上述两种特定时间复杂度的算法,所以教授应该是希望考察暴力遍历和排序这两种基础思路。
内容的提问来源于stack exchange,提问作者Chris c
相关产品推荐
相关产品推荐

