2021-12-14:根据身高重建队列。 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-12-14:根据身高重建队列。 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个相关的知识,希望对你有一定的参考价值。

2021-12-14:根据身高重建队列。
假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。
请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。
力扣406。

答案2021-12-14:

具体见代码。golang代码有点问题,具体可查看java代码。

代码用golang编写。代码如下:

package main

import (
    "fmt"
    "sort"
)

func main() 
    people := [][]int6, 0, 5, 0, 4, 0, 3, 2, 2, 2, 1, 4
    ret := reconstructQueue2(people)
    fmt.Println(ret)


func reconstructQueue1(people [][]int) [][]int 
    N := len(people)
    units := make([]*Unit, N)
    for i := 0; i < N; i++ 
        units[i] = NewUnit(people[i][0], people[i][1])
    
    sort.Slice(units, func(i, j int) bool 
        o1 := units[i]
        o2 := units[j]
        if o1.h != o2.h 
            return o2.h < o1.h
         else 
            return o1.k > o2.k
        
    )
    arrList := make([]*Unit, 0)
    for _, unit := range units 
        arrListCopy := arrList[0:unit.k]
        arrListCopy = append(arrListCopy, unit)
        arrListCopy = append(arrListCopy, arrList[unit.k:]...)
        arrList = arrListCopy
    
    ans := make([][]int, N)
    for i := 0; i < N; i++ 
        ans[i] = make([]int, 2)
    
    index := 0
    for _, unit := range arrList 
        ans[index][0] = unit.h
        ans[index][1] = unit.k
        index++
    
    return ans


func reconstructQueue2(people [][]int) [][]int 
    N := len(people)
    units := make([]*Unit, N)
    for i := 0; i < N; i++ 
        units[i] = NewUnit(people[i][0], people[i][1])
    
    sort.Slice(units, func(i, j int) bool 
        o1 := units[i]
        o2 := units[j]
        if o1.h != o2.h 
            return o2.h < o1.h
         else 
            return o1.k > o2.k
        
    )
    tree := &SBTree
    for i := 0; i < N; i++ 
        tree.insert(units[i].k, i)
    
    allIndexes := tree.allIndexes()

    ans := make([][]int, N)
    for i := 0; i < N; i++ 
        ans[i] = make([]int, 2)
    
    index := 0
    for _, arri := range *allIndexes 
        ans[index][0] = units[arri].h
        ans[index][1] = units[arri].k
        index++
    
    return ans


type Unit struct 
    h int
    k int


func NewUnit(height, greater int) *Unit 
    ret := &Unit
    ret.h = height
    ret.k = greater
    return ret


type SBTNode struct 
    value int
    l     *SBTNode
    r     *SBTNode
    size  int


func NewSBTNode(arrIndex int) *SBTNode 
    ret := &SBTNode
    ret.value = arrIndex
    ret.size = 1
    return ret


func twoSelectOne(c bool, a, b int) int 
    if c 
        return a
     else 
        return b
    


type SBTree struct 
    root *SBTNode


func (this *SBTree) rightRotate(cur *SBTNode) *SBTNode 
    leftNode := cur.l
    cur.l = leftNode.r
    leftNode.r = cur
    leftNode.size = cur.size
    a := 0
    if cur.l != nil 
        a = cur.l.size
    
    b := 0
    if cur.r != nil 
        b = cur.r.size
    
    cur.size = a + b + 1
    return leftNode


func (this *SBTree) leftRotate(cur *SBTNode) *SBTNode 
    rightNode := cur.r
    cur.r = rightNode.l
    rightNode.l = cur
    rightNode.size = cur.size
    cur.size = (twoSelectOne(cur.l != nil, cur.l.size, 0)) + (twoSelectOne(cur.r != nil, cur.r.size, 0)) + 1
    return rightNode


func (this *SBTree) maintain(cur *SBTNode) *SBTNode 
    if cur == nil 
        return nil
    
    leftSize := 0
    if cur.l != nil 
        leftSize = cur.l.size
    
    leftLeftSize := 0
    if cur.l != nil && cur.l.l != nil 
        leftLeftSize = cur.l.l.size
     else 
        leftLeftSize = 0
    
    leftRightSize := 0
    if cur.l != nil && cur.l.r != nil 
        leftRightSize = cur.l.r.size
    
    rightSize := 0
    if cur.r != nil 
        rightSize = cur.r.size
    
    rightLeftSize := 0
    if cur.r != nil && cur.r.l != nil 
        rightLeftSize = cur.r.l.size
    
    rightRightSize := 0
    if cur.r != nil && cur.r.r != nil 
        rightRightSize = cur.r.r.size
    
    if leftLeftSize > rightSize 
        cur = this.rightRotate(cur)
        cur.r = this.maintain(cur.r)
        cur = this.maintain(cur)
     else if leftRightSize > rightSize 
        cur.l = this.leftRotate(cur.l)
        cur = this.rightRotate(cur)
        cur.l = this.maintain(cur.l)
        cur.r = this.maintain(cur.r)
        cur = this.maintain(cur)
     else if rightRightSize > leftSize 
        cur = this.leftRotate(cur)
        cur.l = this.maintain(cur.l)
        cur = this.maintain(cur)
     else if rightLeftSize > leftSize 
        cur.r = this.rightRotate(cur.r)
        cur = this.leftRotate(cur)
        cur.l = this.maintain(cur.l)
        cur.r = this.maintain(cur.r)
        cur = this.maintain(cur)
    
    return cur


func (this *SBTree) insert0(root *SBTNode, index int, cur *SBTNode) *SBTNode 
    if root == nil 
        return cur
    
    root.size++
    leftAndHeadSize := 0
    if root.l != nil 
        leftAndHeadSize = root.l.size + 1
     else 
        leftAndHeadSize = 1
    
    if index < leftAndHeadSize 
        root.l = this.insert0(root.l, index, cur)
     else 
        root.r = this.insert0(root.r, index-leftAndHeadSize, cur)
    
    root = this.maintain(root)
    return root


func (this *SBTree) get0(root *SBTNode, index int) *SBTNode 
    leftSize := twoSelectOne(root.l != nil, root.l.size, 0)
    if index < leftSize 
        return this.get0(root.l, index)
     else if index == leftSize 
        return root
     else 
        return this.get0(root.r, index-leftSize-1)
    


func (this *SBTree) process(head *SBTNode, indexes *[]int) 
    if head == nil 
        return
    
    this.process(head.l, indexes)
    //indexes.addLast(head.value)
    *indexes = append(*indexes, head.value)
    this.process(head.r, indexes)


func (this *SBTree) insert(index, value int) 
    cur := NewSBTNode(value)
    if this.root == nil 
        this.root = cur
     else 
        if index <= this.root.size 
            this.root = this.insert0(this.root, index, cur)
        
    


func (this *SBTree) get(index int) int 
    ans := this.get0(this.root, index)
    return ans.value


func (this *SBTree) allIndexes() *[]int 
    //LinkedList<Integer> indexes = new LinkedList<>();
    indexes := make([]int, 0)
    this.process(this.root, &indexes)
    return &indexes

执行结果如下:


左神java代码

以上是关于2021-12-14:根据身高重建队列。 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个的主要内容,如果未能解决你的问题,请参考以下文章

406. 根据身高重建队列

406. 根据身高重建队列

406. 根据身高重建队列

Leetcode 406.根据身高重建队列

LeetCode 0406. 根据身高重建队列

题目地址(406. 根据身高重建队列)