配列arrが与えられた場合、abs(arr [i] - arr [j])< = kとなる最大abs(i-j)を探します。思考の多くの後kを超えない2つの要素間の最大距離を求める
、私は次のアルゴリズムを思い付いた、
1) Create a new array of pair<arr[i], i> (say arrayIndexPairs)
2) Sort this arrayIndexPairs based on the array value (first of pair).
3) Build a segment tree on the index (second of pair) with the arrayIndexPairs so that we can answer range max queries
4) for i <- 0 to n-1
4.1) rightIndex = Binary search the array values (first of pair) for ceil(arrayIndexPairs[i].first) in the interval [i+1, n-1]
4.2) int maxIndex = rangeQueryForMax(i+1, rightIndex)
4.3) result = max(result, maxIndex - i);
return result
複雑さは、我々は、バイナリ検索O(log n)
+ rangeQuery
、O(log n)
を行うすべての要素のソート+のためO(n log n)
です。全体的な時間の複雑さは、漸近的にであり、これは漸近的にO(nlogn)
である。
アプローチは正しいですか?線形時間解を定式化することは可能ですか?私はハッシュマップを使ってみましたが、リニアソリューションに到達するのは非常に難しいと感じています。
私は前にこの問題を見てきました。 Googleのような会社での古典的な面接の問題。 – IceArdor