高さに基づいてキューを再構築する [貪欲なアルゴリズム]

  1. 高さに基づいてキューを再構成する
    人々のグループがランダムな順序でキューに並んでおり、配列 people がキュー内の一部の人の属性を表しているとします (順序どおりである必要はありません)。each people[i] = [hi, ki] は、i 番目の人の身長が hi であり、彼の前に身長が hi 以上のちょうど ki 人の人がいることを意味します。

入力配列 people で表されるキューを再構築して返してください。返されるキューは配列 queue としてフォーマットする必要があります。ここで、queue[j] = [hj, kj] はキュー内の j 番目の人の属性です (queue[0] はキューの先頭の人です)。
ここに画像の説明を挿入します

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        //先进行按照身高降序排列,身高相等则把k小的排在前面
        Arrays.sort(people, (a, b) -> {
            if (a[0] == b[0]) return a[1] - b[1];//身高相等,则按照k升序的方式进行排列;注意a - b 代表正序,从小到大
            return b[0] - a[0];//否则,按照身高h的降序进行排列
        });

        //需要将重构后的people重新进行定位,需要按照k值确认其需要插入的位置
        //重新构造的结果有顺序,应该用链表进行存储,这样插值的过程时间复杂度较低

        LinkedList<int[]> que = new LinkedList<>();//泛型的确定?为什么用int[],代表表里的是外层元素,而内部不用关心,拿来用即可

        //接下来遍历按照身高进行排序后的结果
        for (int[] p : people) {
            que.add(p[1], p);//插入到链表的对应的索引
        }
        return que.toArray(new int[people.length] []);//将链表转化为数组
    }
}

おすすめ

転載: blog.csdn.net/weixin_47004707/article/details/132590207