java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846
1. 从高到底排序
解题思路:时间复杂度O(
n
2
n^2
n 2 ),首先按照身高降序进行快速排序需要
n
∗
l
o
g
2
n
n*log_{2} n
n ∗ l o g 2 n ,之后需要按照前面有几个人比它高,进行插入排序,需要O(
n
2
n^2
n 2 ),时间复杂度按大头来,所以是O(
n
2
n^2
n 2 )。空间复杂度O(
l
o
g
2
n
log_{2} n
l o g 2 n ),快速排序的栈空间
先将整个数组按照第一个字段(身高)进行降序排列。
如果遇到身高一样的,按照第二个字段进行升序排列。简单来说,身高一样的哥几个,谁的第二个字段值小,谁排前面。
然后使用插入算法,依次将每个元素按照第二个字段插入到对应位置(第二个字段是几就插入到第几个位置)
因为数组此时完成了按照身高降序排列,单拿出任何一个人来说,它现在前面的人,都比它高。 如果当前这个人,需要2个比它高或者和它一样高的人排它前面,那他就放到第2个位置。 因为它前面都比它高,假设它前面有5个人,那么就有5个比它高的。此时将其插入到第二个位置,就只有0和1这两个位置的人比它高了。
因为是按照第一个字段降序排列,第二个字段代表前面比它高或者和它一样高的人数。所以后面的元素(都比前面的小)插入到前面来,对于这些人是不受影响的,因为后面的元素都比它矮。 很重要的一点,相同身高的人,一定是第二个字段小的先来
,例如[5,1]和[5,2].前面有[7,0][7,1].
如果大的先来,先插入[5,2],变成[7,0][7,1][5,2].然后插入[5,1],变成[7,0][5,1],[7,1],[5,2]. 发现了吗,[5,2]前面有3个>=它的,这样就不满足条件了 如果小的先来,先[5,1]变成[7,0][5,1],[7,1]。然后插入[5,2]变成[7,0][5,1],[5,2],[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 ( ) ] [ ] ) ;
}
}