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

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

相关推荐
Deschen21 分钟前
设计模式-原型模式
java·设计模式·原型模式
麦麦鸡腿堡25 分钟前
Java的动态绑定机制(重要)
java·开发语言·算法
それども27 分钟前
SpringBootTest运行线程池被拒绝
java
zy_destiny32 分钟前
【工业场景】用YOLOv8实现抽烟识别
人工智能·python·算法·yolo·机器学习·计算机视觉·目标跟踪
坚持编程的菜鸟42 分钟前
LeetCode每日一题——螺旋矩阵
c语言·算法·leetcode·矩阵
汉克老师44 分钟前
GESP2025年9月认证C++四级( 第三部分编程题(1)排兵布阵)
c++·算法·gesp4级·gesp四级
(●—●)橘子……1 小时前
记力扣2009:使数组连续的最少操作数 练习理解
数据结构·python·算法·leetcode
介一安全1 小时前
【Frida Android】基础篇6:Java层Hook基础——创建类实例、方法重载、搜索运行时实例
android·java·网络安全·逆向·安全性测试·frida
GalaxyPokemon1 小时前
LeetCode - 1171.
算法·leetcode·链表
xyy20251 小时前
Spring事务的传播方式
java·数据库·spring