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 := [][]int{{6, 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
}
执行结果如下:
2021-12-14:根据身高重建队列。 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个的更多相关文章
- 【LEETCODE】73、根据身高重建队列 第406题
说实话,这道题我没想出来,但是看解题报告题解比较让人觉得眼前一亮,这里记录下来 package y2019.Algorithm.greedy.medium; import java.util.Arra ...
- [Swift]LeetCode406. 根据身高重建队列 | Queue Reconstruction by Height
Suppose you have a random list of people standing in a queue. Each person is described by a pair of ...
- Leetcode:根据身高重建队列
题目 假设有打乱顺序的一群人站成一个队列. 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数. 编写一个算法来重建这个队列. 注意: 总人数少于11 ...
- Leetcode 406.根据身高重建队列
根据身高重建队列 假设有打乱顺序的一群人站成一个队列. 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数. 编写一个算法来重建这个队列. 注意:总人 ...
- 406 Queue Reconstruction by Height 根据身高重建队列
假设有打乱顺序的一群人站成一个队列. 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数. 编写一个算法来重建这个队列.注意:总人数少于1100人.示 ...
- 【LeetCode】406-根据身高重建队列
title: 406-根据身高重建队列 date: 2019-04-15 21:13:06 categories: LeetCode tags: Java容器 比较器 贪心思想 题目描述 假设有打乱顺 ...
- LeetCode 406. 根据身高重建队列(Queue Reconstruction by Height) 46
406. 根据身高重建队列 406. Queue Reconstruction by Height 题目描述 假设有打乱顺序的一群人站成一个队列.每个人由一个整数对 (h, k) 表示,其中 h 是这 ...
- Java实现 LeetCode 406 根据身高重建队列
406. 根据身高重建队列 假设有打乱顺序的一群人站成一个队列. 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数. 编写一个算法来重建这个队列. ...
- Noip模拟76 2021.10.14
T1 洛希极限 上来一道大数据结构或者单调队列优化$dp$ 真就没分析出来正解复杂度 正解复杂度$O(q+nm)$,但是据说我的复杂度是假的 考虑一个点转移最优情况是从它上面的一个反$L$形转移过来 ...
- 2021.12.16 eleveni的刷题记录
2021.12.16 eleveni的刷题记录 1. 数论 https://www.luogu.com.cn/problem/P2532 1.1卡特兰数 https://www.luogu.com.c ...
随机推荐
- ls和mkdir
ls 查看当前目录的内容 1) ls -l 显示详细列表 2) Ls -lh 吧文件大小以人性化的方式展开 3) ls -a 显示所有的文件,包括隐藏文件,隐藏文件是已.开头的文件 4) ll 等于 ...
- php 中 session存储
转载网址: https://blog.csdn.net/miliu123456/article/details/107048378/ php 中 session 更换存储方式(file, redis, ...
- 使用 zeromq与cppzmq 程序退出遇到的坑
在使用zeromq 退出的时候还遇到一点坑,对于服务deaman(守护进程)化的进程可能会遇到这个问题. 现象: 这个问题导致的现象是服务一旦关闭(stop),就会 core dump,core du ...
- java中foreach循环用法详解
前言 在前面的文章中,千锋壹哥给大家讲解了for.while.do-while三种循环结构,并讲解了如何跳出循环的几种方式,比如break.continue.return等.但是截止到目前,与循环相关 ...
- springboot格式化timestamp时间
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
- Spring 的核心组件详解
Spring 总共有十几个组件,但是真正核心的组件只有三个:Core.Context 和 Bean.它们构建起了整个 Spring的骨骼架构,没有它们就不可能有 AOP.Web 等上层的特性功能. 一 ...
- 德国坦克傲龙7.1PCIe | 魔音师 声源PCIe MaX 声卡驱动皮肤
适用于德国坦克傲龙7.1PCIe和魔音师 声源PCIe MaX 声卡驱动皮肤的皮肤. 皮肤使用方法:退出声卡驱动程序(托盘图标右键退出),之后删除声卡驱动目录里面的TERRATECAudioCente ...
- Mybatis应用手册
重学mybatis框架,汇成应用手册,整理mybatis中用法且附相关实例,方便日常回顾 目录结构: ----------------- Github手册地址:https://github.com/x ...
- Go 语言:通过TDD测试驱动开发学习 Mocking (模拟)的思想
正文: 现在需要你写一个程序,从 3 开始依次向下,当到 0 时打印 「GO!」 并退出,要求每次打印从新的一行开始且打印间隔一秒的停顿. 3 2 1 Go! 我们将通过编写一个 Co ...
- react商品详情页、购物车逻辑、首页上拉加载、下滑刷新
1.回顾 2.点击列表进入产品的详情页面 设计向页面的布局结构,设计详情页面,入口导入布局文件 // index.js 入口文件 import Detail from '@/Detail'; < ...