小米OJ第18题Go语言实现:
问题链接:https://code.mi.com/problem/list/view?id=18
描述
用一个数组表示一群正在排队的小学生,每个小学生用一对整数 H, K 来表示:H 表示这个小学生的身高,K 表示这个小学生前面应该有 K 个人的身高 >= 他。
写一个算法,对给出的一组小学生计算出符合描述的正确排序。
输入
输入为一组整数,以空格分隔:
第 1 个数字表示小学生的数量 n;
从第 2 个数字起,后续的数字两两一组,分别代表每个小学生的 H 和 K 的值:H_1\text{ }K_1\text{ }H_2\text{ }K_2 \cdots H_n\text{ }K_nH1 K1 H2 K2⋯Hn Kn.
输出
根据输入,按照题目要求对小学生进行排序,每个小学生对应的 H 和 K 值为一组,按组输出,数字间使用空格分隔。比如H_1'\text{ }K_1'\text{ }H_2'\text{ }K_2' \cdots H_n' \text{ }K_n'H1′ K1′ H2′ K2′⋯Hn′ Kn′
输入样例
6 7 0 4 4 7 1 5 0 6 1 5 2
package main
import (
"bufio"
"bytes"
"fmt"
"os"
"sort"
"strconv"
"strings"
)
type Student struct {
Height int64
Index int64
}
func solution18(line string) string {
numsAll := strings.Split(line, " ")
number, _ := strconv.Atoi(numsAll[0])
allArray := make([]Student, number)
resultArray := make([]Student, number)
for i := 1; i < len(numsAll); i += 2 {
Height, _ := strconv.Atoi(numsAll[i])
Index, _ := strconv.Atoi(numsAll[i+1])
student := Student{int64(Height), int64(Index)}
allArray[i/2] = student
}
sort.Slice(allArray, func(i, j int) bool {
if allArray[i].Height == allArray[j].Height {
return allArray[i].Index < allArray[j].Index
}
return allArray[i].Height > allArray[j].Height
})
var byte bytes.Buffer
for i := 0; i < len(allArray); i++ {
resultArray = InsertSort(resultArray, allArray[i], allArray[i].Index)
}
for i := 0; i < len(resultArray); i++ {
byte.WriteString(strconv.FormatInt(resultArray[i].Height, 10))
byte.WriteString(" ")
byte.WriteString(strconv.FormatInt(resultArray[i].Index, 10))
if i!=len(resultArray)-1{
byte.WriteString(" ")
}
}
return byte.String()
}
func InsertSort(array []Student, student Student, index int64) []Student {
if array[index].Height > 0 {
for i := index; i < int64(len(array)); i++ {
if array[i].Height == 0 {
for j := i; j > index; j-- {
array[j] = array[j-1]
}
array[index] = student
return array
}
}
}
array[index] = student
return array
}
func main() {
r := bufio.NewReaderSize(os.Stdin, 20480)
for line, _, err := r.ReadLine(); err == nil; line, _, err = r.ReadLine() {
fmt.Println(solution18(string(line)))
}
}
注:此题在插入排序上的时间复杂度较高,可以采用链表,总体时间复杂度可以降为O(nlogn),主要 花费在排序上,现在是O(n2)。