我正在学习算法的时间复杂度。我不知道为什么下面的代码具有O(n)的时间复杂度。
这是来自解决leetcode问题https://leetcode.com/problems/first-unique-character-in-a-string/discuss/86351/Python-3-lines-beats-100-(~-60ms)-的解决方案!
def firstUniqChar(self, s):
"""
:type s: str
:rtype: int
"""
letters='abcdefghijklmnopqrstuvwxyz'
index=[s.index(le) for le in letters if s.count(le) == 1]
return min(index) if len(index) > 0 else -1
我认为该算法具有O(n ^ 2),这是我的逻辑:
对于le
中的每个letters
,我们需要计算le
从头到尾出现在letters
中的时间,然后找到{ le
中的{1}}从头到尾。
我们基本上遍历letters
,即O(n)。对于每次迭代,我们都在做letters
(也就是O(n))和count
(也都是O(n))。因此,它应该是O(迭代)*(O(计数)+ O(索引))= O(n)*(O(n)+ O(n))= O(2n ^ 2)=> O(n ^ 2)
我的逻辑怎么了?
编辑:
我想我知道我的逻辑出了什么问题。 index
只有26个字母,因此是固定时间。
答案 0 :(得分:5)
Letters
的大小恒定。发生变化的是 s
。
index = []
for le in letters: # O(1)
if s.count(le) == 1: # count is O(n)
index.push(s.index(le)) # index is O(n)
实际上是O(2n)或O(n)。