根据身高重建队列

解题思路: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;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值