Leecode刷题C语言之切蛋糕的最小总开销②

执行结果:通过

执行用时和内存消耗如下:

复制代码
int compare(const void* a, const void* b) {
    return (*(int*)b - *(int*)a);
}

long long minimumCost(int m, int n, int* horizontalCut, int horizontalCutSize, int* verticalCut, int verticalCutSize) {
    qsort(horizontalCut, horizontalCutSize, sizeof(int), compare);
    qsort(verticalCut, verticalCutSize, sizeof(int), compare);
    long long h = 1, v = 1;
    long long res = 0;
    int hIndex = 0, vIndex = 0;
    while (hIndex < horizontalCutSize || vIndex < verticalCutSize) {
        if (vIndex == verticalCutSize || (hIndex < horizontalCutSize && horizontalCut[hIndex] > verticalCut[vIndex])) {
            res += horizontalCut[hIndex++] * h;
            v++;
        } else {
            res += verticalCut[vIndex++] * v;
            h++;
        }
    }
    return res;
}

解题思路:

这段代码的目的是计算将一块矩形面板(尺寸为 m×n)通过水平和垂直切割所需的最小成本。面板可以通过给定数量的水平和垂直切割线来分割。每种切割方式的成本等于切割线长度乘以它所在的较小面板的数量(在切割方向上的面板数量)。下面详细解释这段代码的思路:

  1. 比较函数 compare :
    • 这是一个用于 qsort 排序的比较函数。
    • 它接收两个 const void* 类型的参数 ab,代表要比较的两个元素。
    • 函数通过类型转换将 void* 转换为 int*,然后解引用以获得实际的值。
    • 返回 *(int*)b - *(int*)a,意味着以降序对整数进行排序。
  2. 函数 minimumCost :
    • 参数说明 :
      • mn 分别表示矩形面板的宽度和高度。
      • horizontalCutverticalCut 是两个数组,分别存储所有水平切割线和垂直切割线的位置。
      • horizontalCutSizeverticalCutSize 分别是 horizontalCutverticalCut 数组的大小。
    • 思路 :
      1. 排序切割线 :
        • 使用 qsort 函数和 compare 比较函数,分别对水平和垂直切割线进行降序排序。这是为了方便后续遍历和计算。
      2. 初始化变量 :
        • hv 分别表示当前面板在水平和垂直方向上的分割数量(初始化为1,因为面板本身就是一个完整的区域)。
        • res 用于存储总成本,初始化为0。
        • hIndexvIndex 分别用于遍历水平和垂直切割线的索引。
      3. 遍历切割线 :
        • 使用一个 while 循环,直到所有水平和垂直切割线都被遍历完毕。
        • 在每次迭代中,比较当前遍历到的水平切割线(如果存在)和垂直切割线(如果存在)的位置。
        • 如果当前水平切割线的位置大于或等于当前垂直切割线的位置(或者没有更多的垂直切割线),则处理水平切割线:
          • 将当前水平切割线的位置乘以水平方向上的面板数量 h,并累加到总成本 res 上。
          • 垂直方向上的面板数量 v 增加1(因为添加了一条水平切割线)。
          • 水平切割线索引 hIndex 增加1。
        • 否则,处理垂直切割线:
          • 将当前垂直切割线的位置乘以垂直方向上的面板数量 v,并累加到总成本 res 上。
          • 水平方向上的面板数量 h 增加1(因为添加了一条垂直切割线)。
          • 垂直切割线索引 vIndex 增加1。
      4. 返回结果 :
        • 循环结束后,返回总成本 res

这个算法的关键在于通过排序来简化切割线的处理,并使用两个指针(或索引)来同时遍历水平和垂直切割线,确保每次处理的都是当前最短(因为已排序)的切割线,从而得到最小的成本。

相关推荐
luckys.one10 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
~|Bernard|12 小时前
在 PyCharm 里怎么“点鼠标”完成指令同样的运行操作
算法·conda
战术摸鱼大师12 小时前
电机控制(四)-级联PID控制器与参数整定(MATLAB&Simulink)
算法·matlab·运动控制·电机控制
Christo312 小时前
TFS-2018《On the convergence of the sparse possibilistic c-means algorithm》
人工智能·算法·机器学习·数据挖掘
好家伙VCC13 小时前
数学建模模型 全网最全 数学建模常见算法汇总 含代码分析讲解
大数据·嵌入式硬件·算法·数学建模
皮皮林55114 小时前
SpringBoot 全局/局部双模式 Gzip 压缩实战:14MB GeoJSON 秒变 3MB
java·spring boot
weixin_4569042714 小时前
Spring Boot 用户管理系统
java·spring boot·后端
趁你还年轻_14 小时前
异步编程CompletionService
java
DKPT14 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
sibylyue14 小时前
Guava中常用的工具类
java·guava