406, Queue Reconstruction by Height
I Problem
You are given an array of people, people, which are the attributes of some people in a queue (not necessarily in order). Each people[i] = [hi, ki] represents the iᵗʰ person of height hi with exactly ki other people in front who have a height greater than or equal to hi.
Reconstruct and return the queue that is represented by the input array people. The returned queue should be formatted as an array queue, where queue[j] = [hj, kj] is the attributes of the jᵗʰ person in the queue (queue[0] is the person at the front of the queue).
Example 1
Input: people = [[7, 0], [4, 4], [7, 1], [5, 0], [6, 1], [5, 2]]
Output: [[5, 0], [7, 0], [5, 2], [6, 1], [4, 4], [7, 1]]
Explanation:
Person 0 has height 5 with no other people taller or the same height in front.
Person 1 has height 7 with no other people taller or the same height in front.
Person 2 has height 5 with two persons taller or the same height in front, which is person 0 and 1.
Person 3 has height 6 with one person taller or the same height in front, which is person 1.
Person 4 has height 4 with four people taller or the same height in front, which are people 0, 1, 2, and 3.
Person 5 has height 7 with one person taller or the same height in front, which is person 1.
Hence [[5, 0], [7, 0], [5, 2], [6, 1], [4, 4], [7, 1]] is the reconstructed queue.
Example 2
Input: people = [[6, 0], [5, 0], [4, 0], [3, 2], [2, 2], [1, 4]]
Output: [[4, 0], [5, 0], [2, 2], [3, 2], [1, 4], [6, 0]]
Constraints
1 <= people.length <= 20000 <= hi <= 10⁶0 <= ki < people.length- It is guaranteed that the queue can be reconstructed.
Related Topics
- Binary Indexed Tree
- Segment Tree
- Array
- Sorting
II Solution
Approach 1: Consider From Low to High
pub fn reconstruct_queue(people: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
people.sort_unstable_by(|a, b| a[0].cmp(&b[0]).then(b[1].cmp(&a[1])));
let len = people.len();
let mut res = vec![vec![]; len];
for p in people {
let mut spaces = p[1] + 1;
for i in 0..len {
if res[i].is_empty() {
spaces -= 1;
if spaces == 0 {
res[i] = p;
break;
}
}
}
}
res
}public int[][] reconstructQueue(int[][] people) {
Arrays.sort(
people,
Comparator.comparingInt((int[] o) -> o[0]).thenComparing((o1, o2) -> o2[1] - o1[1])
);
int len = people.length;
int[][] res = new int[len][];
for (int[] p : people) {
int spaces = p[1] + 1;
for (int i = 0; i < len; i++) {
if (res[i] == null) {
spaces--;
if (spaces == 0) {
res[i] = p;
break;
}
}
}
}
return res;
}func reconstructQueue(people [][]int) [][]int {
sort.Slice(people, func(i, j int) bool {
a, b := people[i], people[j]
return a[0] < b[0] || a[0] == b[0] && a[1] > b[1]
})
size := len(people)
res := make([][]int, size)
for _, p := range people {
spaces := p[1] + 1
for i := 0; i < size; i++ {
if res[i] == nil {
spaces--
if spaces == 0 {
res[i] = p
break
}
}
}
}
return res
}Approach 2: Consider From High to Low
pub fn reconstruct_queue(people: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
people.sort_unstable_by(|a, b| b[0].cmp(&a[0]).then(a[1].cmp(&b[1])));
let mut res = Vec::with_capacity(people.len());
for p in people {
let idx = p[1] as usize;
res.insert(idx, p);
}
res
}public int[][] reconstructQueue(int[][] people) {
Arrays.sort(
people,
Comparator.comparingInt((int[] o) -> o[0]).reversed().thenComparingInt(o -> o[1])
);
int len = people.length;
List<int[]> res = new ArrayList<>(len);
for (int[] p : people) {
res.add(p[1], p);
}
return res.toArray(new int[len][]);
}func reconstructQueue(people [][]int) [][]int {
sort.Slice(people, func(i, j int) bool {
a, b := people[i], people[j]
return a[0] > b[0] || a[0] == b[0] && a[1] < b[1]
})
res := make([][]int, 0)
for _, p := range people {
idx := p[1]
res = append(res[:idx], append([][]int{p}, res[idx:]...)...)
}
return res
}