【GO語言學習】每日一題:根據身高重建佇列

某隻沉迷遊戲的廢人.發表於2020-11-17

根據身高重建佇列

題目描述

假設有打亂順序的一群人站成一個佇列。 每個人由一個整數對 (h, k) 表示,其中 h 是這個人的身高,k 是應該排在這個人前面且身高大於或等於 h 的人數。 例如:[5,2] 表示前面應該有2 個身高大於等於 5 的人,而 [5,0] 表示前面不應該存在身高大於等於 5 的人。

編寫一個演算法,根據每個人的身高 h 重建這個佇列,使之滿足每個整數對 (h, k) 中對人數 k 的要求

示列:

輸入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
輸出:[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

解題思路

首先對陣列進行排序,第一個元素從高到低,如果第一個元素相同,第二個元素從高到底。即高個子先站前面,低個子再根據切片第二個值來插入到正確的位置。
圖片來源力扣題解精選
接著進行如下操作來將低個子插入正確位置
圖片來源力扣題解精選
圖片來源力扣題解精選
圖片來源力扣題解精選
圖片來源力扣題解精選
圖片來源力扣題解精選

圖片來源力扣題解精選

程式碼展示

type S [][]int

func sortS(s S){
	sort.Sort(s)
}

func (s S)Swap(i,j int) {
	s[i],s[j]=s[j],s[i]
}

func (s S)Len() int{
	return len(s)
}

func (s S)Less(i,j int) bool{
	// 高的人先排,同樣高的k值小的在前面
	return s[i][0]>s[j][0] || (s[i][0]==s[j][0] && s[i][1]<s[j][1])
}

func reconstructQueue(people [][]int) [][]int {

	var res [][]int
	sortS(people)//先排序
	for key,value:=range people {
		if value[1]<key {
			//插入index位置
			index:=value[1]
			temp:=append([][]int{},res[index:]...)
			res=append(res[0:index],value)
			res=append(res,temp...)
		}else{
			res=append(res,value)//直接插入res尾部
		}
	}
	return res
}

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/queue-reconstruction-by-height

相關文章