LeetCode1051高度检测器

算法解析与代码实现 ------ 解决学生身高排序差异计数问题

题目:

学校打算为全体学生拍一张年度纪念照。根据要求,学生需要按照 非递减 的高度顺序排成一行。

排序后的高度情况用整数数组 expected 表示,其中 expected[i] 是预计排在这一行中第 i 位的学生的高度(下标从 0 开始)。

给你一个整数数组 heights ,表示 当前学生站位 的高度情况。heights[i] 是这一行中第 i 位学生的高度(下标从 0 开始)。

返回满足heights[i] != expected[i]下标数量

题目讲解

想象一下班级里学生们随意站成一排准备拍照,但拍完后老师发现要按身高从矮到高整齐排列才美观,于是就有了这么个需求 ------ 统计一下现在位置不对(即没按身高顺序站)的学生有多少个。输入的 heights 数组记录了当下学生实际站位的身高情况,我们得通过排序这个数组,模拟出理想站位 expected,再去对比找出站位有误的学生数量。

解题思路

先对原 heights 数组进行排序,获取理想状态下学生身高排列的数组 expected,之后逐位对比 heightsexpected,记录两者不相等元素的下标数量,此数量便是答案。

排序操作

在 C 语言里,我们可以选用经典的冒泡排序、插入排序这类基础排序算法。就拿冒泡排序举例,它通过多次遍历数组,相邻元素两两比较,若顺序不对就交换位置,像水里的气泡,大的元素逐渐 "浮" 到数组末尾。代码如下:

cs 复制代码
// 冒泡排序代码片段
for (int i = 0; i < heightsSize - 1; i++) {
    for (int j = 0; j < heightsSize - i - 1; j++) {
        if (sortedHeights[j] > sortedHeights[j + 1]) {
            int temp = sortedHeights[j];
            sortedHeights[j] = sortedHeights[j + 1];
            sortedHeights[j + 1] = temp;
        }
    }
}

代码实现

cs 复制代码
#include <stdio.h>
#include <stdlib.h>

int heightChecker(int* heights, int heightsSize) {
    int* sortedHeights = (int*)malloc(heightsSize * sizeof(int));
    // 复制heights数组到sortedHeights数组
    for (int i = 0; i < heightsSize; i++) {
        sortedHeights[i] = heights[i];
    }
    // 冒泡排序
    for (int i = 0; i < heightsSize - 1; i++) {
        for (int j = 0; j < heightsSize - i - 1; j++) {
            if (sortedHeights[j] > sortedHeights[j + 1]) {
                int temp = sortedHeights[j];
                sortedHeights[j] = sortedHeights[j + 1];
                sortedHeights[j + 1] = temp;
            }
        }
    }
    int count = 0;
    // 对比原数组和排序后的数组,统计不一致的个数
    for (int i = 0; i < heightsSize; i++) {
        if (heights[i]!= sortedHeights[i]) {
            count++;
        }
    }
    free(sortedHeights);
    return count;
}

int main() {
    int heights[] = {1, 1, 4, 2, 1, 3};
    int heightsSize = sizeof(heights) / sizeof(heights[0]);
    int result = heightChecker(heights, heightsSize);
    printf("满足heights[i]!= expected[i]的下标数量为: %d\n", result);
    return 0;
}

复杂度分析

  1. 时间复杂度 :排序占据了主要的时间开销。在 C 语言使用冒泡排序时,时间复杂度为O() ,其中 n 是学生人数(即数组长度),因为要进行多层嵌套循环遍历数组。
  2. 空间复杂度 :C 语言需额外开辟 sortedHeights 数组空间,大小等同于 heights 数组,空间复杂度为 O(n)。
相关推荐
波波0076 分钟前
每日一题:.NET 的 GC是如何分代工作的?
算法·.net·gc
风暴之零16 分钟前
变点检测算法PELT
算法
深鱼~16 分钟前
视觉算法性能翻倍:ops-cv经典算子的昇腾适配指南
算法·cann
李斯啦果17 分钟前
【PTA】L1-019 谁先倒
数据结构·算法
梵刹古音22 分钟前
【C语言】 指针基础与定义
c语言·开发语言·算法
啊阿狸不会拉杆40 分钟前
《机器学习导论》第 5 章-多元方法
人工智能·python·算法·机器学习·numpy·matplotlib·多元方法
R1nG8631 小时前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann
_OP_CHEN2 小时前
【算法基础篇】(五十六)容斥原理指南:从集合计数到算法实战,解决组合数学的 “重叠难题”!
算法·蓝桥杯·c/c++·组合数学·容斥原理·算法竞赛·acm/icpc
TracyCoder1232 小时前
LeetCode Hot100(27/100)——94. 二叉树的中序遍历
算法·leetcode
九.九2 小时前
CANN HCOMM 底层机制深度解析:集合通信算法实现、RoCE 网络协议栈优化与多级同步原语
网络·网络协议·算法