[LeetCode-Golang] 406. 根据身高重建队列

题目

假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。

注意:
总人数少于1100人。

示例

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/queue-reconstruction-by-height
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

个子高的人看不到前面比自己矮的人,所以先按照身高降序,这样再把矮个子放到高个子前面,不影响高个子的前面有多少个比他高(或相等)的人数。

1.对people按照身高降序排序,身高相同,则按k升序排序

2.创建ans切片保存结果,ans[0] = people[0]

3.从people[1]开始遍历,将people[i]放到ans中people[i][1]的位置,即放到相应的k。如果该位置已经有元素,则从该元素开始往后移动一位,然后把people[i]插入

(这样做仍然能保持满足条件,是因为按照身高降序,插入的新元素的身高比原位置的元素要小(或相等,又由于身高相等时,按照k升序排序,所以也满足))

代码

func reconstructQueue(people [][]int) [][]int {
    // 特殊情况
    if len(people) == 0 || len(people) == 1 {
        return people
    }
    // 按照身高降序排序,身高相同,则按k升序排序
    sort.Slice(people, func(i, j int) bool {
        if people[i][0] == people[j][0] {
            return people[i][1] < people[j][1]
        }
        return people[i][0] > people[j][0]
    })
    ans := make([][]int, len(people))
    for i := 0; i < len(people); i++ {
        ans[i] = make([]int, 2)
    }
    // 从people[1]开始插入到k位置,如果该位置已经有元素,则该位置到i-1都后移一位,再插入
    ans[0] = people[0]
    for i := 1; i < len(people); i++ {
        t := people[i][1]
        for j := i; j > t; j-- {
            ans[j] = ans[j-1]
        }
        ans[t] = people[i]

    }
    return ans
}

复杂度分析

时间复杂度:O(N2

空间复杂度:O(N)

执行结果

执行用时 :16 ms, 在所有 Go 提交中击败了90.82% 的用户

内存消耗 :5.9 MB, 在所有 Go 提交中击败了90.91%的用户

原文地址:https://www.cnblogs.com/nini-skyrim/p/12657170.html

时间: 2024-10-09 01:53:15

[LeetCode-Golang] 406. 根据身高重建队列的相关文章

406. 根据身高重建队列

406. 根据身高重建队列 题目描述 假设有打乱顺序的一群人站成一个队列. 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数. 编写一个算法来重建这个队列. 注意: 总人数少于1100人. 示例 输入: [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]] 输出: [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]] 贴出代码 class Solution { public int

Leetcode 406.根据身高重建队列

根据身高重建队列 假设有打乱顺序的一群人站成一个队列. 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数. 编写一个算法来重建这个队列. 注意:总人数少于1100人. 示例 输入: [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]] 输出: [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]] 首先找到身高最高的人并对他们进行排序. 然后找到身高次高的人,按照他们的前面的人数把他

406 Queue Reconstruction by Height 根据身高重建队列

假设有打乱顺序的一群人站成一个队列. 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数. 编写一个算法来重建这个队列.注意:总人数少于1100人.示例输入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]输出:[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]] 详见:https://leetcode.com/problems/queue-reconstruction-by-h

[LeetCode] Queue Reconstruction by Height 根据高度重建队列

Suppose you have a random list of people standing in a queue. Each person is described by a pair of integers(h, k), where h is the height of the person and k is the number of people in front of this person who have a height greater than or equal to h

LeetCode Golang实现 1. 两数之和

1. 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 方法一: 暴力法: leetCode 给出运行时间 60ms func twoSum(nums []int

Leetcode题解——数据结构之栈和队列

1. 用栈实现队列 2. 用队列实现栈 3. 最小值栈 4. 用栈实现括号匹配 5. 数组中元素与下一个比它大的元素之间的距离 6. 循环数组中比当前元素大的下一个元素 1. 用栈实现队列 232. Implement Queue using Stacks (Easy) 栈的顺序为后进先出,而队列的顺序为先进先出.使用两个栈实现队列,一个元素需要经过两个栈才能出队列,在经过第一个栈时元素顺序被反转,经过第二个栈时再次被反转,此时就是先进先出顺序. class MyQueue { private

LeetCode 232:用栈实现队列 Implement Queue using Stacks

题目: 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部. pop() -- 从队列首部移除元素. peek() -- 返回队列首部的元素. empty() -- 返回队列是否为空. Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of queue. pop() -- Removes the element from in

LeetCode 232题用栈实现队列(Implement Queue using Stacks) Java语言求解

题目链接 https://leetcode-cn.com/problems/implement-queue-using-stacks/ 题目描述 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部.pop() -- 从队列首部移除元素.peek() -- 返回队列首部的元素.empty() -- 返回队列是否为空. 示例: MyQueue queue = new MyQueue();queue.push(1);queue.push(2); queue.peek(); //

【LeetCode】面试题59 - II. 队列的最大值

题目链接: 面试题59 - II. 队列的最大值 题目描述: 请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数 max_value.push_back 和 pop_front 的时间复杂度都是 O(1). 若队列为空,pop_front 和 max_value 需要返回 -1. 示例: 示例 1: 输入: ["MaxQueue","push_back","push_back","max_value",