说实话,这道题我没想出来,但是看解题报告题解比较让人觉得眼前一亮,这里记录下来
package y2019.Algorithm.greedy.medium; import java.util.Arrays; import java.util.LinkedList; /** * @Auther: xiaof * @Date: 2019/12/19 09:05 * @Description: 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 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 * */ public class ReconstructQueue { /** * https://leetcode-cn.com/problems/queue-reconstruction-by-height/solution/406-gen-ju-shen-gao-zhong-jian-dui-lie-pai-xu-hou-/ * 执行用时 : 10 ms , 在所有 java 提交中击败了 76.85% 的用户 * 内存消耗 : 40 MB , 在所有 java 提交中击败了 99.37% 的用户 */ public int[][] solution(int[][] people) { //1.思路就是先按照升高排序,先按照升高排序,升高相同的按照第二个前面几个人进行排序 Arrays.sort(people, (v1, v2) -> v1[0] == v2[0] ? v1[1] - v2[1] : v2[0] - v1[0]); //2.然后遍历数组,依次吧中的升高添加到数据中,然后把 //3.根据排好顺序的list,吧第二个参数作为下坐标add进入队列中 LinkedList<int[]> res = new LinkedList<>(); //因为已经加入linked的数据都是比当前遍历到的数据大的值,那么只要知道前面有几个比这个数大,直接插入即可 for (int[] i : people) { res.add(i[1], i); } return res.toArray(new int[res.size()][2]); } public static void main(String[] args) { int[][] param1 = {{7,0}, {4,4}, {7,1}, {5,0}, {6,1}, {5,2}}; ReconstructQueue fuc = new ReconstructQueue(); System.out.println("需要添加对应的数据:"); int[][] res = fuc.solution(param1); System.out.println(""); System.out.println(res); } }