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

每日算法刷题Day19 5.31:leetcode二分答案3道题,用时1h

6. 475.供暖器(中等,学习check函数双指针思想)

475. 供暖器 - 力扣(LeetCode)

思想

1.冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。在加热器的加热半径范围内的每个房屋都可以获得供暖。现在,给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。
2.单调性检验:加热半径越小,越可能不能覆盖所有房屋,不满足条件,所以存在一个最小加热半径
3.难点在于check函数怎么写,我原来的思想是遍历heaters,然后把[heaters[i]-x,heaters[i]+x]变为true,但这样会超出内存限制
4.学习:
(1)先将houses和heaters进行排序(最重要)
(2)让i指向当前判断房屋houses[i],然后j指向可能(先确保右边界成立) 覆盖到的heaters[j],x为加热半径

  • 当且仅当heaters[j]+x<houses[i]时,第i个房屋必定不能被第j个加热器覆盖,然j自增
  • 退出循环说明找到合适的j(右边界必然成立,找到能覆盖的最小加热器),再判断heaters[j]-x<=houses[i]<=heaters[j]+x是否满足
代码

c++:

class Solution {
public:bool check(vector<int>& houses, vector<int>& heaters, int mid) {int n = houses.size(), m = heaters.size();int j = 0;for (int i = 0; i < n; ++i) {while (j < m && houses[i] > heaters[j] + mid)++j; // 寻找能覆盖的最小加热器if (j < m && heaters[j] - mid <= houses[i] &&houses[i] <= heaters[j] + mid)continue; // 满足条件看下一个房子return false; // 不满足条件}return true;}int findRadius(vector<int>& houses, vector<int>& heaters) {int res = 0;sort(houses.begin(), houses.end());sort(heaters.begin(), heaters.end());int maxho = INT_MIN, minho = INT_MAX, maxhe = INT_MIN, minhe = INT_MAX;for (const int x : houses) {maxho = max(maxho, x);minho = min(minho, x);}for (const int x : heaters) {maxhe = max(maxhe, x);minhe = min(minhe, x);}int left = 0, right = max(abs(maxho - minhe), abs(maxhe - minho));while (left <= right) {int mid = left + ((right - left) >> 1);if (check(houses, heaters, mid)) {res = mid;right = mid - 1;} elseleft = mid + 1;}return res;}
};
7. 2594.修车的最少时间(中等)

2594. 修车的最少时间 - 力扣(LeetCode)

思想

1.给你一个整数数组 ranks ,表示一些机械工的 能力值 。ranksi 是第 i 位机械工的能力值。能力值为 r 的机械工可以在 r * n2 分钟内修好 n 辆车。同时给你一个整数 cars ,表示总共需要修理的汽车数目。请你返回**修理所有汽车(条件) ** 最少 需要多少时间(答案)
2.类似于3296.移山所需的最少秒数
3.单调性检验,时间越少,越不可能修理所有汽车,所以存在一个最少时间

代码

c++:

class Solution {
public:bool check(vector<int>& ranks, int cars, long long mid) {long long sum = 0;for (const int x : ranks) {sum += (long long)sqrt(mid / x);if (sum >= cars)return true;}return false;}long long repairCars(vector<int>& ranks, int cars) {long long res = 0;int minval = INT_MAX;for (const int x : ranks)minval = min(minval, x);long long left = 1, right = 1LL * minval * cars * cars;while (left <= right) {long long mid = left + ((right - left) >> 1);if (check(ranks, cars, mid)) {res = mid;right = mid - 1;} elseleft = mid + 1;}return res;}
};

1.不用转换为long long的,可以写成1LL

8. 1482.制作m束花所需的最少天数

1482. 制作 m 束花所需的最少天数 - 力扣(LeetCode)

思想

1.给你一个整数数组 bloomDay,以及两个整数 mk 。现需要制作 m 束花。制作花束时,需要使用花园中 相邻的 k 朵花(小条件) 。花园中有 n 朵花,第 i 朵花会在 bloomDay[i] 时盛开,恰好可以用于 一束 花中。请你返回从花园中摘 m 束花(条件) 需要等待的最少的天数(答案)。如果不能摘到 m 束花则返回 -1
2.单调性检验:天数越少,越不能摘到m束花,所以存在一个最少天数

代码

c++:

class Solution {
public:bool check(vector<int>& bloomDay, int m, int k, int mid) {int n = bloomDay.size();int sum = 0, cnt = 0;for (int i = 0; i < n; ++i) {if (bloomDay[i] <= mid) {++cnt;if (cnt == k) {++sum;if (sum >= m)return true;cnt = 0;}} else {cnt = 0;}}return false;}int minDays(vector<int>& bloomDay, int m, int k) {int res = -1;int maxval = INT_MIN;for (const int x : bloomDay)maxval = max(maxval, x);int left = 1, right = maxval;while (left <= right) {int mid = left + ((right - left) >> 1);if (check(bloomDay, m, k, mid)) {res = mid;right = mid - 1;} elseleft = mid + 1;}return res;}
};
http://www.lryc.cn/news/2394573.html

相关文章:

  • 【线上故障排查】缓存热点Key导致Redis性能下降的排查与优化
  • 关于镜像如何装进虚拟机
  • CPU特权级别:硬件与软件协同构建系统安全的基石
  • 智慧体育馆数字孪生,场馆管理智能化
  • 回归算法模型之线性回归
  • 【深度学习】10. 深度推理(含链式法则详解)RNN, LSTM, GRU,VQA
  • 【Java】在 Spring Boot 中连接 MySQL 数据库
  • 影响服务器稳定性的因素都有什么?
  • 【Qt】Bug:findChildren找不到控件
  • GitHub 趋势日报 (2025年05月30日)
  • 【linux】linux进程概念(四)(环境变量)超详细版
  • Qt程序添加调试输出窗口:CONFIG += console
  • 从零开始的二三维CAD|CAE软件: 解决VTK,DICOM体素化-失效问题.
  • android协程异步编程常用方法
  • 【计算机网络】应用层协议Http——构建Http服务服务器
  • 【求A类B类月】2022-2-9
  • 信息安全之为什么引入公钥密码
  • linux版本vmware修改ubuntu虚拟机为桥接模式
  • pytest 常见问题解答 (FAQ)
  • 从0到1上手Trae:开启AI编程新时代
  • HTTPS 协议:数据传输安全的坚实堡垒
  • Spring Boot中使用@JsonAnyGetter和@JsonAnySetter处理动态JSON属性
  • Spring Boot测试框架全面解析
  • Linux之MySQL安装篇
  • Asp.Net Core 如何配置在Swagger中带JWT报文头
  • 第12讲、Odoo 18 权限控制机制详解
  • 8086 处理器 Flags 标志位全解析:CPU 的 “晴雨表” 与 “遥控器”总结:
  • 具有离散序列建模的统一多模态大语言模型【AnyGPT】
  • PHP HTTP 完全指南
  • 物流项目第九期(MongoDB的应用之作业范围)