• 算法
    • 1.排序people数组,person[0]降序,person[1]升序
    • 2.从高往低遍历数组,最高的人的person[1]即是它重建后的位置,如果已经有人,将它插入,后序右移(因为后序的都是先插入的都比它高)
      • 当list中第person[1]个位置尚未填充时,填充该person
      • 当list中第person[1]个位置已经填充时,插入该person,后序右移
public int[][] reconstructQueue(int[][] people) {
    Arrays.sort(people, (p1, p2) -> (p1[0] == p2[0] ? p1[1] - p2[1] : p2[0] - p1[0]));
    ArrayList<int[]> list = new ArrayList<>(Collections.nCopies(people.length, null));
    for (int[] person : people) {
        int k = person[1];
        if (list.get(k) == null) {
            list.set(k, person);
        } else {
            list.add(k, person);
        }
    }
    for (int i = 0; i < people.length; i++) {
        people[i] = list.get(i);
    }
    return people;
}
type Int2DSlice [][]int
func (p Int2DSlice) Len() int { return len(p) }
func (p Int2DSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
func (p Int2DSlice) Less(i, j int) bool {
    if p[i][0] == p[j][0] {
        return p[i][1] < p[j][1]
    } else {
        return p[i][0] < p[j][0]
    }
}

func reconstructQueue(people [][]int) [][]int {
    sort.Sort(Int2DSlice(people))
    result := make([][]int, len(people))
    for _, person := range people {
        k := person[1]
        for j := 0; j < len(people); j++ {
            if result[j] == nil || result[j][0] >= person[0] {
                k--
            }
            if k == -1 {
                result[j] = person
                break
            }
        }
    }
    return result
}
  • 算法
    • 1.排序people数组,person[0]升序
    • 2.从低往高遍历数组,最低的人位置先确定,后序接着确定第二低的人
      • 最低的人的位置就是它的person[1],这个person[1]的含义指的是:从左往右计数,尚未填充person的和填充person的比它高或等高的,这种算上,第person[1]个
public int[][] reconstructQueue(int[][] people) {
    Arrays.sort(people, (p1, p2) -> (p1[0] == p2[0] ? p2[1] - p1[1] : p1[0] - p2[0]));
    List<int[]> list = new ArrayList<>(Collections.nCopies(people.length, null));
    for (int[] person : people) {
        int k = person[1];
        for (int j = 0; j < people.length; j++) {
            if (list.get(j) == null || list.get(j)[0] >= person[0]) {
                k--;
            }
            if (k == -1) {
                list.set(j, person);
                break;
            }
        }
    }
    for (int i = 0; i < people.length; i++) {
        people[i] = list.get(i);
    }
    return people;
}
type Int2DSlice [][]int
func (p Int2DSlice) Len() int { return len(p) }
func (p Int2DSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
func (p Int2DSlice) Less(i, j int) bool {
    if p[i][0] == p[j][0] {
        return p[i][1] < p[j][1]
    } else {
        return p[i][0] > p[j][0]
    }
}

func reconstructQueue(people [][]int) [][]int {
    sort.Sort(Int2DSlice(people))
    result := make([][]int, len(people))
    for _, person := range people {
        k := person[1]
        if result[k] == nil {
            result[k] = person
        } else {
            temp := result[k]
            for i := k; i < len(result) - 1 && result[i] != nil; i++ {
                result[i+1], temp = temp, result[i+1]
            }
            result[k] = person
        }
    }
    return result
}