当前位置: 首页 > ds >正文

每日算法-250513

每日算法 - 2024-05-13

记录今天学习的算法题解。


2335. 装满杯子需要的最短总时长

题目

Problem Description

思路

贪心

这道题的关键在于每次操作尽可能多地减少杯子的数量。我们每次操作可以装一杯或两杯(不同类型)。为了最小化总时间,应该优先选择装两杯不同类型的水。

解题过程

问题的最优解受到两个因素的制约:

  1. 数量最多的那杯水:假设数量最多的水需要 max_val 杯。由于每次操作最多只能装一杯这种类型的水,所以我们至少需要 max_val 秒才能把这种水装完。这是一个时间的下限。
  2. 总水量:假设总水量为 total_sum = amount[0] + amount[1] + amount[2]。由于每次操作最多装两杯水,装完 total_sum 杯水至少需要 ceil(total_sum / 2) 秒。这里的 ceil 表示向上取整,因为如果总数是奇数,最后一次操作只能装一杯。在整数除法中,(total_sum + 1) / 2 可以实现向上取整的效果。这也是一个时间的下限。

最短的总时长必须同时满足这两个下限条件。因此,最终答案就是这两个下限中的较大值:max(max_val, (total_sum + 1) / 2)

可以证明,总是存在一种贪心策略(例如,每次都优先选择数量最多的两种水来装)可以达到这个下限。

复杂度

  • 时间复杂度: O ( 1 ) O(1) O(1)。只需要进行常数次的比较和算术运算。
  • 空间复杂度: O ( 1 ) O(1) O(1)。只需要常数级别的额外空间存储变量。

Code

class Solution {public int fillCups(int[] amount) {// 找到数量最多的杯子数int maxVal = 0;int totalSum = 0;for (int count : amount) {maxVal = Math.max(maxVal, count);totalSum += count;}int avgOps = (totalSum + 1) / 2; return Math.max(maxVal, avgOps);}
}

1753. 移除石子的最大得分

题目

Problem Description

思路

贪心

目标是最大化操作次数(每次操作得1分)。每次操作需要从两堆不同的非空石子堆中各取一个。为了尽可能多地进行操作,我们应该避免让某一堆石子过早地被单独剩下。因此,贪心策略是每次都选择当前石子数最多的两堆进行操作。

解题过程

为了方便分析,我们先对三堆石子的数量 a, b, c 进行排序,假设排序后为 min_val <= mid_val <= max_val

考虑贪心策略:每次都从最多的两堆(max_valmid_val)中取石子。

分析两种情况:

  1. max_val >= mid_val + min_val:
    在这种情况下,最大堆的石子数量大于等于另外两堆之和。我们可以将 mid_val 堆和 min_val 堆的石子完全与 max_val 堆配对消耗完。

  2. max_val < mid_val + min_val:
    在这种情况下,最大堆的石子数不足以单独消耗掉另外两堆。这意味着我们可以持续地从最大的两堆中取石子,直到所有石子几乎被取完(最多只会剩下一个石子)。
    总石子数为 S = max_val + mid_val + min_val。每次操作减少2个石子。我们可以进行的操作次数取决于总石子数 S

    • 如果 S 是偶数,最多可以进行 S / 2 次操作,最后没有石子剩下。
    • 如果 S 是奇数,最多可以进行 (S - 1) / 2 次操作,最后会剩下1个石子。
      这两种情况合并起来就是 floor(S / 2) 次操作。在整数除法中,(max_val + mid_val + min_val) / 2 正好计算出 floor(S / 2)
      因此,最大得分为 (max_val + mid_val + min_val) / 2

综合这两种情况,即为题解。

复杂度

  • 时间复杂度: O ( 1 ) O(1) O(1)。对三个数排序(或找到最大、最小、中间值)以及后续计算都是常数时间。
  • 空间复杂度: O ( 1 ) O(1) O(1)。只需要常数级别的额外空间。

Code

class Solution {public int maximumScore(int a, int b, int c) {int max = Math.max(a, Math.max(b, c));int min = Math.min(a, Math.min(b, c));int mid = (a + b + c) - (max + min);if (max >= mid + min) {return mid + min;} else {return (max + mid + min) / 2;}}
}

2592. 最大化数组的伟大值(复习)

题目

Problem Description

这是第二次写这道题了,典型的田忌赛马问题,写的还不错,就不多说了,详细题解可以参考之前的笔记:每日算法-250428

Code

class Solution {public int maximizeGreatness(int[] nums) {int ret = 0;Arrays.sort(nums);int left = 0, right = nums.length - 1, i = right;while (left <= right) {if (nums[i] >= nums[right]) {left++;} else {ret++;right--;}i--;}return ret;}
}

http://www.xdnf.cn/news/6137.html

相关文章:

  • 使用PocketFlow构建Web Search Agent
  • java为什么要实现自动装箱和拆箱
  • Promise.all静态方法
  • 乙酰基六肽-39/Silusyne 新型减肥活性肽,减少脂肪堆积
  • 火山引擎发展初始
  • 高效跨平台文件传输与管理的工具
  • SimScape物理建模实例2--带控制的单质量弹簧阻尼系统
  • PPT制作-平滑切换
  • logback 日志归档,解决主日志和归档日志分别定义不同的周期
  • Manus 开放注册:AI 智能体领域的新起点
  • 岩土拉压试验机
  • ​​华为云服务器:智能算力网格​
  • 计数循环java
  • 24年面试问题总结记录
  • 光学(1)
  • CVE-2025-31258 macOS远程视图服务沙箱逃逸漏洞PoC已公开
  • 【老飞飞源码】新版高清飞飞源码+数据库+客户端+服务器端完整文件打包
  • C++语法基础(下)
  • 【经验总结】【乘法替换方法】
  • coco数据集mAP评估
  • function call介绍和实现(以DeepSeek为例)
  • 2025高质量数据集实践指南
  • 无人机避障——(运动规划部分)深蓝学院动力学kinodynamic A* 3D算法理论解读(附C++代码)
  • 聊聊JetCache的CachePenetrationProtect
  • Baklib知识中台驱动企业智慧服务升级
  • WebGIS 开发中的数据安全与隐私保护:急需掌握的要点
  • MongoDB 的主要优势和劣势是什么?适用于哪些场景?
  • 安卓刷机模式详解:Fastboot、Fastbootd、9008与MTK深刷
  • 19.three官方示例+编辑器+AI快速学习webgl_buffergeometry_points
  • 缺乏需求变更的影响评估,如何降低项目风险