学校在拍年度纪念照时,一般要求学生按照 非递减 的高度顺序排列。
请你返回能让所有学生以 非递减 高度排列的最小必要移动人数。
注意,当一组学生被选中时,他们之间可以以任何可能的方式重新排序,而未被选中的学生应该保持不动。
1,首先我们进行一轮桶排序,即查看一个桶里装了几个元素,例如 1 4 3 1 5,a[1]=2:数值是1的桶装了两个1;
2,然后从小到大的位置开始检查对应位置是否对应正确的值。
3,不对应的就sum+1;
class Solution {
public int heightChecker(int[] heights) {
int [] arr = new int[101];//申请101个空间,因为1 <= heights[i] <= 100,所以需要的桶可能是从1 //到100
int sum=0;
for(int height:heights){
arr[height]++;//遍历每个桶里面有几个元素,如1 1 2 3 4 1 则arr[1]=3,arr[2]=1,
}
for(int i=1,j=0;i<arr.length;i++){
while(arr[i]-->0){//从小位置开始检查当前位置对应的值是否是正确的,如arr[1]=3,也就代表第1 //个位置,第二个位置,第三个位置都应该是1,
if(heights[j++]!=i){//开始判断对应的位置上对应的值是否正确,如arr[1]=3,数组heights //[0]下标开始存储,因为有三个1(1是最小的)判断第一个位置heights //[0]、第二个位置heights[1]、第三个位置heights[2]是否等于1,否 //sum++
sum++;
}
}
}
return sum;
}
}