O(1)常数时间解的例子
O(1) Constant time solution example?
我有一个任务,需要计算青蛙从位置X跳到大于或等于Y的位置,给定每次跳跃的固定距离(D)。
如X = 10;Y = 85;D = 30;答案= ((Y-X)/D) = 3;
解的复杂度必须为O(1)。
显而易见的解决方案不起作用:
int diff=Y-X;
int jumps=diff/D;
因为if跳转返回一个向下舍入的double类型,这将不等于或大于
我可以使用while循环:
int diff=Y-X;
int jumps=0;
int jumps_counter=0;
while(jumps<diff)
{
jumps+=D;
jumps_counter++;
}
但是很明显这不是O(1),而是O(x-y)…
解决这个问题的最好方法是什么?明显的解决办法是四舍五入。
int diff = Y-X;
int jumps = std::ceil((double)diff/D);
这是一个O(1)操作,避免了循环查找所需的步数。
int jumps = diff / D + (diff % D ? 1 : 0);
使用D = 30的大小跳跃,从10开始
10 -> 40 -> 70 -> 100
所以总共跳了3次…
你需要一个简单的公式:ceil((y-x)/d)
,其中ceil(z)是大于z的最小整数
在python中应该是
import math
math.ceil( (float)(y-x)/d )
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 从持续时间构造std::chrono::system_clock::time_point
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 使用简单类型列表实现的指数编译时间.为什么
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在已经使用Git的情况下减少编译时间
- 结构成员的地址作为编译时间常数之间的差异
- 编译时间评估函数以计算常数
- 用于检查编译时间常数的静态断言未传递给宏
- 用O(1)表示法求一系列数字的平均值——常数时间
- 有没有一种方法可以在向量常数时间的中间插入一些东西
- 在常数O(1)时间内连接2个STL矢量
- 哪种方法更适合为函数提供编译时间常数?函数实参与模板形参
- 在常数空间和O(n)时间内找到重复条目的算法
- 一个数据结构的线性时间构造,如果两个字符串有两个共同的字母,则在常数时间内回答
- 表的常数时间反向拼接
- O(1)常数时间解的例子
- 具有常数时间操作的数据结构
- 我如何在常数时间(O(1))内获得字母表(1-26)中字符的数值/位置,而不使用任何内置方法或函数