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

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

相关推荐
二两小咸鱼儿18 分钟前
Java Demo - JUnit :Unit Test(Assert Methods)
java·后端·junit
字节源流22 分钟前
【spring】配置类和整合Junit
java·后端·spring
跪在镜子前喊帅1 小时前
【面试】Java 多线程
java·面试
好看资源平台1 小时前
Java/Kotlin逆向基础与Smali语法精解
java·开发语言·kotlin
zimoyin1 小时前
解决 Java/Kotlin 资源加载问题
java·python·kotlin
安忘2 小时前
LeetCode 热题 -189. 轮转数组
算法·leetcode·职场和发展
Y1nhl2 小时前
力扣hot100_二叉树(4)_python版本
开发语言·pytorch·python·算法·leetcode·机器学习
阿木看源码2 小时前
bindingAdapter的异常错误
java·开发语言
曼诺尔雷迪亚兹3 小时前
2025年四川烟草工业计算机岗位备考详细内容
数据结构·数据库·计算机网络·算法
跪在镜子前喊帅3 小时前
【面试】框架
java·面试