java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 |
---|
文章目录
1. 从高到底排序
解题思路:时间复杂度O(
n
2
n^2
n2),首先按照身高降序进行快速排序需要
n
∗
l
o
g
2
n
n*log_{2} n
n∗log2n,之后需要按照前面有几个人比它高,进行插入排序,需要O(
n
2
n^2
n2),时间复杂度按大头来,所以是O(
n
2
n^2
n2)。空间复杂度O(
l
o
g
2
n
log_{2} n
log2n),快速排序的栈空间 |
---|
- 然后使用插入算法,依次将每个元素按照第二个字段插入到对应位置(第二个字段是几就插入到第几个位置)
- 因为是按照第一个字段降序排列,第二个字段代表前面比它高或者和它一样高的人数。所以后面的元素(都比前面的小)插入到前面来,对于这些人是不受影响的,因为后面的元素都比它矮。
很重要的一点,相同身高的人,一定是第二个字段小的先来
,例如[5,1]和[5,2].前面有[7,0][7,1].
class Solution {
public int[][] reconstructQueue(int[][] people) {
Arrays.sort(people, new Comparator<int[]>() {
@Override
public int compare(int[] person1, int[] person2) {
if(person1[0] != person2[0]) return person2[0] - person1[0];
else return person1[1] - person2[1];
}
});
List<int[]> ans = new ArrayList<>();
for(int[] person:people)
ans.add(person[1],person);
return ans.toArray(new int[ans.size()][]);
}
}