每日算法4/21

LCR 073. 爱吃香蕉的狒狒

题目

狒狒喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。

狒狒可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉,下一个小时才会开始吃另一堆的香蕉。  

狒狒喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。

返回她可以在 H 小时内吃掉所有香蕉的最小速度 KK 为整数)。

示例 1:

输入: piles = [3,6,7,11], H = 8
输出: 4

示例 2:

输入: piles = [30,11,23,4,20], H = 5
输出: 30

示例 3:

输入: piles = [30,11,23,4,20], H = 6
输出: 23

提示:

  • 1 <= piles.length <= 10^4
  • piles.length <= H <= 10^9
  • 1 <= piles[i] <= 10^9

思路

二分答案

  1. 首先确定答案的区间范围
  2. 然后根据题目建立check函数
  3. 然后不断对答案区间进行二分找到符合题目的答案 

代码

bool check(int* piles, int pilesSize, int h, int mid) {
    long int sum = 0;
    for (int i = 0; i < pilesSize; i++) {
        sum += (piles[i] + mid - 1) / mid;
    }
    return sum <= h;
}
int minEatingSpeed(int* piles, int pilesSize, int h) {
    int l = 1;
    int r = 0;
    for (int i = 0; i < pilesSize; i++) {
        if (piles[i] >= r)
            r = piles[i];
    }
    int ans = 0;
    while (l <= r) {
        int mid = (r + l) / 2;
        if (check(piles, pilesSize, h, mid)) {
            ans = mid;
            r = mid - 1;
        } else {
            l = mid + 1;
        }
    }
    return ans;
}

64. 最小路径和

题目

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例 1:

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。

示例 2:

输入:grid = [[1,2,3],[4,5,6]]
输出:12

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 200
  • 0 <= grid[i][j] <= 200

思路

定义 dp[i] [j]的含义为:

  • 当机器人从左上角走到(i, j) 这个位置时,最下的路径和是 dp[i] [j]

找出关系数组元素间的关系式:

  • 由于机器人可以向下走或者向右走,所以有两种方式到达
  • 一种是从 (i-1, j) 这个位置走一步到达
  • 一种是从(i, j - 1) 这个位置走一步到达
  • 题目是计算哪一个路径和是最小的,那么我们要从这两种方式中,选择一种,使得dp[i] [j] 的值是最小的,显然有dp[i] [j] = min(dp[i-1][j],dp[i][j-1]) + arr[i][j];

找出初始值:

最上面一行,机器人只能一直往左走:dp[0] [j] = arr[0] [j] + dp[0] [j-1];

最左面一列,机器人只能一直往下走:dp[i] [0] = arr[i] [0] + dp[i] [0];

代码

int minPathSum(int** grid, int gridSize, int* gridColSize) {
    int m = *gridColSize;
    int n = gridSize;
    if (m < 0 || n < 0) {
        return 0;
    }
    int dp[m][n];
    dp[0][0] = grid[0][0];
    for (int i = 1; i < m; i++) {
        dp[i][0] = dp[i - 1][0] + grid[i][0];
    }
    for (int i = 1; i < n; i++) {
        dp[0][i] = dp[0][i - 1] + grid[0][i];
    }
    for (int i = 1; i < n; i++) {
        for (int j = 1; j < n; j++) {
            dp[i][j] = fmin(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
        }
    }
    return dp[m - 1][n - 1];
}

 

相关推荐

  1. leetcode每日一题41

    2024-04-22 13:10:06       34 阅读
  2. 算法--每日一练

    2024-04-22 13:10:06       21 阅读
  3. 每日算法4.17

    2024-04-22 13:10:06       16 阅读
  4. 每日算法

    2024-04-22 13:10:06       10 阅读
  5. 每日一练算法

    2024-04-22 13:10:06       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-22 13:10:06       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-22 13:10:06       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-22 13:10:06       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-22 13:10:06       18 阅读

热门阅读

  1. 低配置的电脑上刷新WPF DataGrid 很卡,如何优化?

    2024-04-22 13:10:06       15 阅读
  2. /sys/class/dmi/id/目录文件详解,查看系统硬件信息

    2024-04-22 13:10:06       16 阅读
  3. .NET/C#汇总 —— WPF

    2024-04-22 13:10:06       12 阅读
  4. 【Terraform实战】如何从头自动起一个nginx实例

    2024-04-22 13:10:06       15 阅读
  5. C# 扩展运算符(...)的详细解析

    2024-04-22 13:10:06       15 阅读
  6. ActiveMQ入门案例(queue模式和topic模式)

    2024-04-22 13:10:06       13 阅读
  7. Go的题目

    2024-04-22 13:10:06       14 阅读