题目大意如下:
在10W数中通过比较的方式找出前100大的数,比较次数不超过102000次,额外最多允许申请一个空间。
package main
import (
"fmt"
_ "math"
"math/rand"
)
func solution(arr []int) ([]int, int){
length := len(arr)
middleArrLayers := getLayer(length)
middleArrLength := getLength(middleArrLayers)
middle := make([]int, middleArrLength)
count := 0
for i := 0;i<len(middle);i++{
middle[i] = -1
}
result := make([]int, 0)
layerStartIndex := getLayerIndex(middleArrLayers)
layerCurrentIndex := layerStartIndex
for arrIndex := 0;arrIndex<length;arrIndex++ {
middle[layerCurrentIndex] = arrIndex
layerCurrentIndex++
}
for currentLayer := middleArrLayers;currentLayer>0;currentLayer--{
start := getLayerIndex(currentLayer)
end := getLayerIndex(currentLayer+1)
for index_:= start; index_ < end; index_+=2 {
parent := getParent(index_)
count++
var maxIndex int
if middle[index_] == -1 {
middle[parent] = -1
} else {
if middle[index_+1] == -1 {
middle[parent] = middle[index_]
} else {
if index_+1 < end {
if arr[middle[index_]] >= arr[middle[index_+1]] {
maxIndex = middle[index_]
} else {
maxIndex = middle[index_+1]
}
} else {
maxIndex = middle[index_]
}
middle[parent] = maxIndex
}
}
}
}
for i:=0;i<100;i++ {
result = append(result, arr[middle[1]])
bottomIndex := getBottom(middle, middle[1], middleArrLength)
middle[bottomIndex] = -1
current := bottomIndex
for current > 0 {
parent := getParent(current)
left := 2*parent
right := 2*parent + 1
if middle[left] == -1 && middle[right] == -1 {
middle[parent] = -1
current = parent
} else if middle[left] == -1 {
middle[parent] = middle[right]
current = parent
} else if middle[right] == -1 {
middle[parent] = middle[left]
current = parent
} else {
if arr[middle[left]] >= arr[middle[right]] {
middle[parent] = middle[left]
count++
} else {
middle[parent] = middle[right]
count++
}
current = parent
}
}
}
return result, count
}
func getLayer(n int) int {
i := 0
currentLayer := 1
for currentLayer < n {
currentLayer *= 2
i++
}
return i
}
func getLength(n int) int {
length := 1
for i:=0;i<=n;i++ {
length *= 2
}
return length+1
}
func getLayerIndex(n int) int {
startIndex := 1
for i:= 0;i<n;i++ {
startIndex *= 2
}
return startIndex
}
func getParent(index int) int {
return index / 2
}
func getBottom(middleArr []int, index int, length int) int {
current := 1
for current*2 < length {
if middleArr[current*2] == index {
current = current*2
} else if current*2+1 < length && middleArr[current * 2+1] == index{
current = current*2 + 1
} else {
break
}
}
return current
}
func getRandomData() []int {
data := make([]int, 0)
for i:=0;i<100001;i++{
data = append(data, rand.Int()%100000)
}
return data
}
func main() {
data:= getRandomData()
result, count := solution(data)
fmt.Println(result)
fmt.Println(count)
}