【LeetCode每日一题】——1051.高度检查器

文章目录

  • 一【题目类别】
  • 二【题目难度】
  • 三【题目编号】
  • 四【题目描述】
  • 五【题目示例】
  • 六【解题思路】
  • 七【题目提示】
  • 八【时间频度】
  • 九【代码实现】
  • 十【提交结果】

一【题目类别】

  • 排序

二【题目难度】

  • 简单

三【题目编号】

  • 1051.高度检查器

四【题目描述】

  • 学校打算为全体学生拍一张年度纪念照。根据要求,学生需要按照 非递减 的高度顺序排成一行。
  • 排序后的高度情况用整数数组 expected 表示,其中 expected[i] 是预计排在这一行中第 i 位的学生的高度(下标从 0 开始)。
  • 给你一个整数数组 heights ,表示 当前学生站位 的高度情况。heights[i] 是这一行中第 i 位学生的高度(下标从 0 开始)。
  • 返回满足 heights[i] != expected[i] 的 下标数量 。

五【题目示例】

  • 示例1:

    • 输入:heights = [1,1,4,2,1,3]
    • 输出:3
    • 解释:
      • 高度:[1,1,4,2,1,3]
      • 预期:[1,1,1,2,3,4]
      • 下标 2 、4 、5 处的学生高度不匹配。
  • 示例 2:

    • 输入:heights = [5,1,2,3,4]
    • 输出:5
    • 解释:
      • 高度:[5,1,2,3,4]
      • 预期:[1,2,3,4,5]
      • 所有下标的对应学生高度都不匹配。
  • 示例 3:

    • 输入:heights = [1,2,3,4,5]
    • 输出:0
    • 解释:
      • 高度:[1,2,3,4,5]
      • 预期:[1,2,3,4,5]
      • 所有下标的对应学生高度都匹配。

六【解题思路】

  • 本题如果直接拷贝原数组,然后拷贝后比较找下标的话,那么这题就没有难度了
  • 所以本题采用基数排序的思想
  • 首先计算数组最大值,那么数组中的元素范围肯定是[1-最大值]
  • 然后统计它们出现的次数
  • 之后从小开始计算,看它们能“消耗”多少,如果刚好消耗,那就合法,否则就是不合法的位置(统计)。这里的idea不太好描述,具体可以看代码
  • 最后返回结果即可

七【题目提示】

  • 1 < = h e i g h t s . l e n g t h < = 100 1 <= heights.length <= 100 1<=heights.length<=100
  • 1 < = h e i g h t s [ i ] < = 100 1 <= heights[i] <= 100 1<=heights[i]<=100

八【时间频度】

  • 时间复杂度: O ( N × C ) O(N×C) O(N×C),其中 N N N为数组的长度, C C C为数组最大值
  • 空间复杂度: O ( C ) O(C) O(C),其中 C C C为数组最大值

九【代码实现】

  1. Java语言版
package Sort;

/**
 * @Author: IronmanJay
 * @Description: 1051.高度检查器
 * @CreateTime: 2022-11-15  08:59
 */
public class p1051_HeightChecker {

    public static void main(String[] args) {
        int[] heights = {1, 1, 4, 2, 1, 3};
        int res = heightChecker(heights);
        System.out.println("res = " + res);
    }

    public static int heightChecker(int[] heights) {
        int maxHeight = 0;
        for (int i = 0; i < heights.length; i++) {
            if (heights[i] > maxHeight) {
                maxHeight = heights[i];
            }
        }
        int[] count = new int[maxHeight + 1];
        for (int h : heights) {
            count[h]++;
        }
        int index = 0;
        int res = 0;
        for (int i = 1; i <= maxHeight; i++) {
            for (int j = 1; j <= count[i]; j++) {
                if (heights[index] != i) {
                    res++;
                }
                index++;
            }
        }
        return res;
    }

}
  1. C语言版
#include

int heightChecker(int* heights, int heightsSize)
{
	int maxHeight = 0;
	for (int i = 0; i < heightsSize; i++)
	{
		if (heights[i] > maxHeight)
		{
			maxHeight = heights[i];
		}
	}
	int* count = (int*)calloc(maxHeight + 1, sizeof(int));
	for (int i = 0; i < heightsSize; i++)
	{
		count[heights[i]]++;
	}
	int index = 0;
	int res = 0;
	for (int i = 1; i <= maxHeight; i++)
	{
		for (int j = 1; j <= count[i]; j++)
		{
			if (heights[index] != i)
			{
				res++;
			}
			index++;
		}
	}
	return res;
}

/*主函数省略*/

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. C语言版
    在这里插入图片描述

你可能感兴趣的:(LeetCode,leetcode,算法,数据结构,基数排序,排序算法)