Leetcode打卡:切蛋糕的最小总开销II

执行结果:通过

题目 3219 切蛋糕的最小总开销II

有一个 m x n 大小的矩形蛋糕,需要切成 1 x 1 的小块。

给你整数 mn 和两个数组:

  • horizontalCut 的大小为 m - 1 ,其中 horizontalCut[i] 表示沿着水平线 i 切蛋糕的开销。
  • verticalCut 的大小为 n - 1 ,其中 verticalCut[j] 表示沿着垂直线 j 切蛋糕的开销。

一次操作中,你可以选择任意不是 1 x 1 大小的矩形蛋糕并执行以下操作之一:

  1. 沿着水平线 i 切开蛋糕,开销为 horizontalCut[i]
  2. 沿着垂直线 j 切开蛋糕,开销为 verticalCut[j]

每次操作后,这块蛋糕都被切成两个独立的小蛋糕。

每次操作的开销都为最开始对应切割线的开销,并且不会改变。

请你返回将蛋糕全部切成 1 x 1 的蛋糕块的 最小 总开销。

示例 1:

**输入:**m = 3, n = 2, horizontalCut = [1,3], verticalCut = [5]

**输出:**13

解释:

  • 沿着垂直线 0 切开蛋糕,开销为 5 。
  • 沿着水平线 0 切开 3 x 1 的蛋糕块,开销为 1 。
  • 沿着水平线 0 切开 3 x 1 的蛋糕块,开销为 1 。
  • 沿着水平线 1 切开 2 x 1 的蛋糕块,开销为 3 。
  • 沿着水平线 1 切开 2 x 1 的蛋糕块,开销为 3 。

总开销为 5 + 1 + 1 + 3 + 3 = 13

示例 2:

**输入:**m = 2, n = 2, horizontalCut = [7], verticalCut = [4]

**输出:**15

解释:

  • 沿着水平线 0 切开蛋糕,开销为 7 。
  • 沿着垂直线 0 切开 1 x 2 的蛋糕块,开销为 4 。
  • 沿着垂直线 0 切开 1 x 2 的蛋糕块,开销为 4 。

总开销为 7 + 4 + 4 = 15

提示:

  • 1 <= m, n <= 105
  • horizontalCut.length == m - 1
  • verticalCut.length == n - 1
  • 1 <= horizontalCut[i], verticalCut[i] <= 103

代码以及解题思路

代码:

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;

}

解题思路:

  1. 排序切割线
    • 使用 qsort 函数对 horizontalCutverticalCut 数组进行排序。compare 函数确保了排序是按照降序进行的,这对于后续步骤中的比较和计算至关重要。排序的目的是为了方便处理切割线,确保在计算成本时,我们可以按顺序处理水平切割线和垂直切割线。
  2. 初始化变量
    • hv 分别表示当前处理到的水平区域的高度和垂直区域的宽度。初始时,整个蛋糕是一个完整的区域,所以高度和宽度均为1。
    • res 用于累加总的切割成本。
    • hIndexvIndex 分别表示当前处理的水平切割线和垂直切割线的索引。
  3. 遍历切割线
    • 使用 while 循环遍历所有的切割线。循环条件是 hIndex < horizontalCutSize || vIndex < verticalCutSize,意味着只要还有未处理的切割线,就继续循环。
    • 在循环内部,通过比较当前处理的水平切割线和垂直切割线的位置,决定先处理哪一条切割线。由于切割线数组是降序排序的,所以可以直接通过比较当前索引对应的切割线位置来决定。
    • 如果先处理水平切割线,那么将该切割线对应的面积(horizontalCut[hIndex] * h)加到总成本 res 上,并将水平区域的计数 h 加1,表示现在处理的是下一个水平区域。同时,水平切割线索引 hIndex 自增。
    • 如果先处理垂直切割线,那么操作类似,只不过是将垂直区域的宽度 v 加1,并更新垂直切割线索引 vIndex
  4. 返回结果
    • 当所有的切割线都被处理后,循环结束,返回累加的总成本 res

总结:

  • 代码通过排序确保切割线按顺序处理。
  • 使用两个变量 hv 分别追踪当前处理的水平区域的高度和垂直区域的宽度。
  • 通过比较当前处理的切割线位置,决定先处理哪一条切割线,并计算相应的成本。
  • 最终返回所有切割操作所需的最小成本。
相关推荐
真就死难2 小时前
完全日期(日期枚举问题)--- 数学性质题型
算法·日期枚举
不知道取啥耶2 小时前
C++ 滑动窗口
数据结构·c++·算法·leetcode
花间流风2 小时前
晏殊几何学讲义
算法·矩阵·几何学·情感分析
@心都2 小时前
机器学习数学基础:42.AMOS 结构方程模型(SEM)分析的系统流程
人工智能·算法·机器学习
菜鸟00883 小时前
蓝桥杯第二天:2023省赛C 1题 分糖果
c语言·职场和发展·蓝桥杯
我想吃烤肉肉3 小时前
leetcode-sql数据库面试题冲刺(高频SQL五十题)
数据库·sql·leetcode
阿卡好可爱4 小时前
锐势信息的面试
面试·职场和发展
北顾南栀倾寒5 小时前
[算法笔记]cin和getline的并用、如何区分两个数据对、C++中std::tuple类
笔记·算法
东月之神5 小时前
【0基础跟AI学软考高项】进度管理
职场和发展·微信小程序
互联网杂货铺6 小时前
python+pytest 接口自动化测试:参数关联
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·pytest