欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode——1051.高度检查器

程序员文章站 2024-03-15 14:10:42
...

学校在拍年度纪念照时,一般要求学生按照 非递减 的高度顺序排列。

请你返回能让所有学生以 非递减 高度排列的最小必要移动人数。

注意,当一组学生被选中时,他们之间可以以任何可能的方式重新排序,而未被选中的学生应该保持不动。

思路

咋开始看这道题,很乱,不知道乱七八糟说啥玩意儿。看来读题也是很重要的,最后仔细一想,就是为了计算当前有多少个位置的数值跟排序后的数值不一致。那就可以解决了

代码

import java.util.Arrays;

class Solution {
    public int heightChecker(int[] heights) {
        int length=heights.length;
        int test[]=new int[length];
        for (int i=0;i<length;++i)
            test[i]=heights[i];
        Arrays.sort(test);

        int count=0;//计算需要移动的人数
        for (int i=0;i<length;++i)
            if (heights[i]!=test[i])
                ++count;
        return count;
    }
}

结果

LeetCode——1051.高度检查器
现在对于力扣的结果越来越感到不可思议了,我想这个原因,很大程度上是因为力扣的测试数据不够多,造成了两种方法本身效率提升很多但是看起来几乎没有差别。

这种解法的时间,主要花在两个循环就是O(n)和排序O(logn)的时间上。

题解改进思路

既然力扣的测试数据如此之小,我们还可以利用一个桶排序来解决排序的问题。

改机代码

class Solution {
    public int heightChecker(int[] heights) {
        int length=heights.length;
        int test[]=new int [101];//因为数值的范围是1-100,所以需要开101个位置的数组

        //把数组中的值放到桶中,这样从桶中取出来的数值就是有序的了
        for (int i=0;i<length;++i)
            test[heights[i]]++;

        int count=0;//计算不同的个数

        //遍历一遍桶
        for (int i=1,j=0;i<101;++i)
        {
            while(test[i]-->0)//从桶中每次取出一个元素,先取出来,再减去,能够保证把所有的数值都取完
                if (heights[j++]!=i)//开始遍历 heights数组,只要这个数组的对应位置,不等于从桶中取出来的数
                    ++count;        //通中取出来的数就是 i 
        }
        return  count;

    }
}

结果

LeetCode——1051.高度检查器
题解这种解法真的妙,虽然能大概想到利用桶排序来解,不过还是这个解法很猛!学到了!

相关标签: LeetCode