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

leetcode每日一题day22(24.10.2)——准时到达的列车最小时速


思路:这种在有约束条件情况下,求最值或最符合要求的情况,首先是很容易想到,从时速为1开始往后找找到满足条件就输出,但这无疑工程量很大,每种可能的速度都要对列车数组进行遍历,

时间复杂度为CN

(C为可能的所有速度,在最不好运的情况下,C是有可能远大于N的,本题就是,C最大为10^9 约为N的二次方倍,此时换算成N约为N^3)

优化:对于一个可能的速度V如果V不能满足要求则比V小的速度都不用再考虑,V满足要求比V大的速度也必定满足,由此便可引入二分查找。

得到如下代码

class Solution {
public:int up_div(int a, int b) { return a / b + (a % b == 0 ? 0 : 1); }int minSpeedOnTime(vector<int>& dist, double hour) {if (dist.size() - 1 >= hour) {return -1;}int max_v = 1e7, min_v = 1, mid_v, size = dist.size();double cut_time = 0;while (min_v < max_v) {cut_time = 0;mid_v = (long)(max_v + min_v) >> 1;for (int i = 0; i < size - 1; i++) {cut_time += up_div(dist[i], mid_v);}cut_time += (double)dist[size - 1] / mid_v;if (cut_time <= hour) {cout<<max_v<<"  ";max_v = mid_v;} else {min_v = mid_v + 1;}}return min_v;}
};

此时使用的速度范围为1到1e7 ,其中1e7有题目给出的数据范围得到,(最大的dist为1e7,最小的小数为0.01),由于double进行取整时有精度丢失问题,可以使用round(double) 进行向上取整。

此时时间复杂度为:log2(C)N

前者有N^2优化到最差情况也只有30左右,优化巨大

后续则是对速度区间的优化,代码如下(优化不大)

class Solution {
public:int up_div(int a, int b) { return a / b + (a % b == 0 ? 0 : 1); }int minSpeedOnTime(vector<int>& dist, double hour) {// 剪枝if (dist.size() - 1 >= hour) {return -1;}int max_v = 0, min_v = 1, mid_v, size = dist.size();double cut_time = 0;// 优化查找区间阶段for (int i : dist) {// 当最长的路程,都只需要一个小时即可,那么每汤列车都是花费一个小时,此为最少时间情况下,速度尽可能慢的情况.max_v = max(i, max_v);}int temp = (long)round((hour * 100))% 100;if (temp)max_v = up_div(max_v * 100, temp );// 二分查找阶段while (min_v < max_v) {cut_time = 0;mid_v = (long)(max_v + min_v) >> 1;for (int i = 0; i < size - 1; i++) {cut_time += up_div(dist[i], mid_v);}cut_time += (double)dist[size - 1] / mid_v;if (cut_time <= hour) {max_v = mid_v;} else {min_v = mid_v + 1;}}return min_v;}
};


http://www.mrgr.cn/news/41723.html

相关文章:

  • 网站开发基础:JavaScript
  • 哪些芯片封装需要基板,哪些不需要?
  • 如何从 PC 中检索已删除的文件?从 PC 恢复已删除的照片技巧
  • 解决OpenCV保存视频 视频全部为绿色的bug
  • string的实现(下)
  • 生信初学者教程(二十三):REF+SVM筛选候选标记物
  • 大语言模型入门(三)——提示词编写注意事项
  • MYSQL 乐观锁
  • 路由交换实验指南
  • [产品管理-41]:什么是变量、属性、特征、特性?他们的相同点、不同点?
  • C++ 语言特性10 - 委托构造函数
  • 开放式耳机哪个品牌好?分享几款不错的开放式蓝牙耳机
  • C++常引用详解
  • Java开发类加载器实现机制
  • Visual Studio 使用技巧之界面布局
  • 浏览器 F12 application 应用程序面板
  • 10. 模块
  • 大学城就餐推荐系统小程序的设计
  • 深入理解 Git 一个开发者的必备工具
  • 【2023工业3D异常检测文献】Shape-Guided: 基于形状引导和双记忆库的异常检测方法