Leetcode 1051. 高度检查器

这题的目的是找出排序后和排序前位置不同的元素的个数

正常通过复制出一个新的数组,然后对比排序后的数组就能做出,但是时间是1ms

然后发现一种基于桶排序来计数的做法

    public int heightCheckerV2() {
        int[] heights = {1,1,4,2,1,3};
        // 值的范围是1 <= heights[i] <= 100,因此需要1,2,3,...,99,100,共101个桶
        int[] arr = new int[101];
        for (int height : heights) {
            //将值作为桶数组的下标,存的是出现的次数
            arr[height]++;
        }
        //桶数据的元素
        //[0, 3, 1, 1, 1,....]
        //这样就可以确定原数组的顺序,比如排序后的数组前三个元素应该是1

        int count = 0;
        //i=1是因为从取值是从1开始
        for (int i = 1, j = 0; i < arr.length; i++) {
            //判断当前下标有没有计数,如果有就减一个计数,直到数据取完
            while (arr[i]-- > 0) {
                //判断当前数组下标的值是不是等于预期的值,不等于就记录
                if (heights[j++] != i) count++;
            }
        }
        return count;
    }

虽然执行时间变成0ms了,但是内存消耗增加了,是个空间换时间的方法

posted @ 2022-06-13 16:09  阿弱  阅读(23)  评论(0编辑  收藏  举报