小米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)。