В псевдокоде это может быть так:
Вы можете отсортировать текущий массив по убыванию, а затем начать вычисления следующим образом:
diffList = {}
calculate(array,k) :
if (k<=0) OR (array.length < 2) OR (k > 2^(array.length-1))
return nothing // whatever behavior you want (exception or null Integer whatever suits you)
else
return kthLargest(k, 0 , array.length-1, array)
end if
kthLargest(count, upperBound, lowerBound, array) :
if count = 0
if upperBound != lowerBound
return max(array[upperBound]-array[lowerBound], max(sortDesc(diffList)))
else
return max(sort(diffList))
end if
else if upperBound = lowerBound
sortDesc(diffList)
return diffList[count]
else
topDiff = array[upperBound]-array[upperBound+1]
botDiff = array[lowerBound-1]-array[lowerbound]
if(topDiff > botDiff)
add botDiff to diffList
return kthLargest(count-1,upperBound,lowerBound-1,array)
else
add topDiff to diffList
return kthLargest(count-1,upperBound+1,lowerBound,array)
end if
end if
Вызовите метод вычисления (массив, k), и все готово.
Это в основном отслеживает «отброшенную кучу» различий, в то же время повторяя и сокращая границы, чтобы всегда иметь вашу последнюю наибольшую разницу, равную разнице текущих границ или потенциальному лучшему значению в этой отброшенной стопке.
Оба вида (опущены для краткости) должны сделать это O (n log n).
Вы можете заменить массивы на наиболее удобные коллекции и развернуть это также в итеративное решение.
Исправления приветствуются!