这个对于程序员来说, 无外乎做个循环,然后累加
def solution(n):
result = 0
for i in xrange(n):
result += (i + 1)
return result
看起来很轻松就搞定了, 但是这个有90%程序员不知道的算法(包括我,不过现在知道了)
就是这个
def solution(n):
# 在python中//是向下取整的意思..
result = n * (n + 1) // 2
return result
这是一个小技巧,但是运算的速度却千差万别. 对于这个差别,有个说法,叫时间复杂度.
在软件工程中,时间复杂度是一种衡量算法效率的方式,它描述了算法的运行时间如何随着问题规模的增加而增加。
它通常表示为O(f(n)),其中f(n)是一个函数,表示算法的时间随着问题规模n的增加而增加的速度。通常来说,问题规模越大,算法所需的时间就越长。
时间复杂度可以用来比较两个算法的效率,以便在实现特定功能时选择更好的算法。
常见的时间复杂度有常数时间O(1),对数时间O(log n),线性时间O(n),二次时间O(n²),三次时间O(n³)等。通常来说,时间复杂度越小,算法的效率越高。
在进行时间复杂度分析时,需要考虑最坏情况下的运行时间。这是因为最坏情况下的运行时间提供了算法在最不利情况下的运行时间。通常情况下,时间复杂度分析不考虑常数因子,只考虑规模最大的部分,因为这部分通常对运行时间的影响最大。
再看一下之前的代码
def solution(n):
result = 0 # 时间复杂度:O(1)
for i in xrange(n): # 时间复杂度:O(n),因为循环次数与输入n成正比
result += (i + 1) # 时间复杂度:O(1),加法和赋值操作的时间复杂度均为常数级别
return result # 时间复杂度:O(1)
我们可以看到这段代码中的每一部分的时间复杂度。为了计算整体时间复杂度,我们需要将循环体内的时间复杂度(O(1))乘以循环的次数(O(n)),然后再加上其他部分的时间复杂度(O(1))。
因此,整体时间复杂度为:O(1) + O(n) * O(1) + O(1) = O(n)。
def solution(n):
result = n * (n + 1) // 2 # 时间复杂度:O(1),因为这里的乘法、加法和除法操作都是常数级别的
return result # 时间复杂度:O(1)
整体时间复杂度为:O(1) + O(1) = O(1)。
这个解法利用了数学公式计算累加求和,因此不需要遍历,时间复杂度降为常数级别。
所以, 从1.......+ n 的算法, 你也学会了吗?
时间复杂度, 可以专门学习下..