解题思路:1、先按照排名进行排序,排名小的在前,若名次相同,身高矮的在前面。
2、然后按照身高大小,逐一与前面的人比较,若小于前面的人的身高,则计数器加1,当计数器等于
名次时,就逐步移动数组元素,将其放到合适的位置上。
public int[][] reconstructQueue(int[][] people)
{
int n = people.length;
for (int i=0; i<n; i++)
{
for (int j=i+1; j<n; j++)
{
// 先按照排名h排序,小的再前
if ( people[i][1] > people[j][1])
{
swap(i, j, people);
}
// 排名相同,身高矮的排在前面
else if ( people[i][1] == people[j][1] && people[i][0] > people[j][0])
{
swap(i, j, people);
}
}
}
int ncount = 0;
int m = 0;
// 再按照身高排名,调整次序
for (int i=1; i<n; i++)
{
ncount = 0;
for (int j=0; j<i; j++)
{
if (people[i][0] <= people[j][0]) // 遇到比它大的,计算排名
{
ncount++;
if (ncount == people[i][1])
{
// 还要判断把后面比i身高矮的过滤掉。(贪心)
for (m=j+1; m<i; m++)
{
if (people[m][0] < people[i][0])
continue;
else
break;
}
System.out.println(m);
// 移动元素
for (int k=i-1; k>=m; k--)
{
swap(k, k+1, people);
}
break; // 处理下一项
}
}
}
}
return people;
}
void swap(int i, int j, int[][] array)
{
int tmp1 = array[i][0];
int tmp2 = array[i][1];
array[i][0] = array[j][0];
array[i][1] = array[j][1];
array[j][0] = tmp1;
array[j][1] = tmp2;
}