Queue Reconstruction by Height
题目链接:https://leetcode.com/problems...
greedy的题感觉思路好难写啊。
首先肯定是要排序,首先想到的思路是先按h再按k排序,h从低到高,k从高到低,原因是第一步想先把是0的yi 个一个放进结果里,然后把前面的k都--,第二遍还是找k = 0的。一直重复到结束。
es: [[4, 4], [5, 2], [5, 0], [6, 1], [7, 1], [7, 0]]
-
第一遍:
result: [[5, 0], [7, 0]]
aux: [[4, 2], [5, 0], [6, 0], [7, 0]]
-
第二遍:
result: [[5, 0], [7, 0], [5, 2], [6, 1]]
aux: [[4, 0], [7, 0]]
-
第三遍:
result: [[5, 0], [7, 0], [5, 2], [6, 1], [4, 4], [7, 1]]
aux: []
每次最前面的减的是最多的,所以考虑倒过来做:
[[7, 0], [7, 1], [6, 1], [5, 0], [5, 2], [4, 4]]
这样减的时候就是碰到[7, 0]之后[7, 1], [6, 1]先减1,碰到了[5, 0],之后[5, 2], [4, 4]是减2。又由于减到0的时候要倒过来append到结果里面,实际上就是把h小的查到前面对应位置的过程。discussion给的解法实在太厉害了,真想不出来。
public class Solution {
public int[][] reconstructQueue(int[][] people) {
if(people.length == 0) return people;
Arrays.sort(people, (a, b) -> a[0] == b[0] ? a[1] - b[1] : b[0] - a[0]);
List<int[]> result = new ArrayList();
for(int[] person : people) {
result.add(person[1], person);
}
return result.toArray(new int[result.size()][2]);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。