不要被高度检查器迷惑了,这道题其实是考察排序算法的

不要被高度检查器迷惑了,这道题其实是考察排序算法的_第1张图片

本篇博客会讲解力扣“1051. 高度检查器”的解题思路,这是题目链接。

不要被高度检查器迷惑了,这道题其实是考察排序算法的_第2张图片
由于高度数组的元素都不超过100,我们可以利用计数排序的思路,创建一个长度为101的数组cnt,用来记录每个高度出现的次数。具体做法是,以cnt的下标表示高度,以下标对应的元素值表示该高度出现的次数。这样,cnt数组就相当于是原高度数组的有序版本。然后,我们同时遍历原高度数组和cnt数组,比较对应位置的高度是否一致,累计不一致的次数即为答案。

int heightChecker(int* heights, int heightsSize){
    // size <= 100,故使用计数排序
    int cnt[101] = {0};
    for (int i = 0; i < heightsSize; ++i)
    {
        ++cnt[heights[i]];
    }

    // 统计不匹配的数量
    int j = 0; // 高度数组下标
    int ret = 0;
    for (int i = 1; i <= 100; ++i) // 高度
    {
        while (cnt[i]--)
        {
            if (heights[j] != i)
            {
                ++ret;
            }
            ++j;
        }
    }

    return ret;
}

不要被高度检查器迷惑了,这道题其实是考察排序算法的_第3张图片

总结

掌握计数排序的思想,能够在数组范围较小的情况下,实现高效的排序。

感谢大家的阅读!

你可能感兴趣的:(力扣刷题,排序算法,算法,力扣,c语言,leetcode)