我有一個算法找到O(log n)
中兩個大的排序數組的中值,但是如何在相同的時間複雜度下返回給出中位數的中間兩個數?例如:給定array1 = [1, 2, 3, 4, 50, 62, 77]
和array2 = [ 17, 27, 33, 89, 600, 700, 900]
,應返回33,50。Swift中的O(log n)時間中的中間數
我的代碼找到中位數:我無法修改它只返回中位數。
class FindMedianSortedArrays {
func findMedian(input: [Int], startIndex: Int, endINdex: Int) -> Double {
let indexDifference = (endINdex - startIndex)
if indexDifference % 2 == 0 {
return Double(input[startIndex + (indexDifference/2)])
} else {
return Double(input[startIndex + (indexDifference/2)] + input[startIndex + (indexDifference/2) + 1])/2.0
}
}
func findMedianInSortedArray(inputA: [Int], inputB: [Int], startIndexA: Int, endIndexA: Int, startIndexB: Int, endIndexB: Int) -> Double {
var startIndexA = startIndexA
var endIndexA = endIndexA
var startIndexB = startIndexB
var endIndexB = endIndexB
if ((endIndexA - startIndexA) < 0) || ((endIndexB - startIndexB) < 0) {
print("Invalid Input")
}
if (endIndexA - startIndexA == 0) && (endIndexB - startIndexB == 0) {
return Double(inputA[0] + inputB[0])/2.0
}
if endIndexA - startIndexA == 1 && endIndexB - startIndexB == 1 {
return Double(max(inputA[startIndexA], inputB[startIndexB]) + min(inputA[endIndexA], inputB[endIndexB]))/2.0
}
let medianA: Double = findMedian(input: inputA, startIndex: startIndexA, endINdex: endIndexA)
let medianB: Double = findMedian(input: inputB, startIndex: startIndexB, endINdex: endIndexB)
//our second base case
if medianB == medianA {
return medianB //return either medianA or medianB
}
//since medianA <= median <= medianB,
//eliminate elements less than medianA and greater than medB
if medianA < medianB {
if((endIndexA - startIndexA) % 2 == 0) {
startIndexA = startIndexA + (endIndexA - startIndexA)/2
endIndexB = startIndexB + (endIndexB - startIndexB)/2
} else {
startIndexA = startIndexA + (endIndexA - startIndexA)/2
endIndexB = startIndexB + (endIndexB - startIndexB)/2 + 1
}
}
//since medianB <= median <= medianA, eliminate elements less
//than medianB and greater than medianA to narrow down the search.
else {
if ((endIndexB - startIndexB) % 2 == 0) {
startIndexB = startIndexB + (endIndexB - startIndexB)/2
endIndexA = startIndexA + (endIndexA - startIndexA)/2 + 1
}
}
return findMedianInSortedArray(inputA:inputA, inputB: inputB, startIndexA: startIndexA, endIndexA:endIndexA, startIndexB: startIndexB, endIndexB: endIndexB)
}
}
在陣列1獨特的項目?或者是否有機會擁有像這樣的東西[1,2,3,4,4,50,50,62,77] – yarlg