发现我的代码的复杂性
Finding complexity of my Code
我正在尝试解决以下问题,该问题取自 leetcode(https://leetcode.com/problems/first-missing-positive/)
给定一个未排序的整数数组,找到第一个缺失的正整数。
例如,
给定 [1,2,0] return 3,
和 [3,4,-1,1] return 2.
您的算法应该在 O(n) 时间内 运行 并使用常量 space。
class Solution(object):
def firstMissingPositive(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
for i in range(len(nums)):
while nums[i] != i+1:
if nums[i]<=0 or nums[i]>len(nums) or nums[i]==nums[nums[i]-1]:
break
else:
temp=nums[nums[i]-1]
nums[nums[i]-1]=nums[i]
nums[i]=temp
for i in range(len(nums)):
if nums[i]!=i+1:
return i+1
return len(nums)+1
b=Solution()
print b.firstMissingPositive([1,1])
我确信这个解决方案的复杂度为 O(n^2)。但是仍然有很多在线解决方案使用相同的算法。
谁能解释一下这段代码的复杂度是 O(n)
这个解决方案确实O(n)
.
首先,请注意主循环中的 if 子句最多发生 n
次(每个 i
的值最多发生一次)。
此外,else
子句也出现了 O(n)
次,因为如果一个值已经在它的位置上,你就永远不会再改变它的位置(由 if 条件保证)。
因此,在主循环中,if
子句最多有 n
个条目,else
子句最多有 n
个条目,给出此循环的总 运行 时间 O(n)
。
第二个循环(未嵌套在第一个循环中)也是 O(n)
,因此总复杂度为 O(n)
我正在尝试解决以下问题,该问题取自 leetcode(https://leetcode.com/problems/first-missing-positive/)
给定一个未排序的整数数组,找到第一个缺失的正整数。
例如, 给定 [1,2,0] return 3, 和 [3,4,-1,1] return 2.
您的算法应该在 O(n) 时间内 运行 并使用常量 space。
class Solution(object):
def firstMissingPositive(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
for i in range(len(nums)):
while nums[i] != i+1:
if nums[i]<=0 or nums[i]>len(nums) or nums[i]==nums[nums[i]-1]:
break
else:
temp=nums[nums[i]-1]
nums[nums[i]-1]=nums[i]
nums[i]=temp
for i in range(len(nums)):
if nums[i]!=i+1:
return i+1
return len(nums)+1
b=Solution()
print b.firstMissingPositive([1,1])
我确信这个解决方案的复杂度为 O(n^2)。但是仍然有很多在线解决方案使用相同的算法。
谁能解释一下这段代码的复杂度是 O(n)
这个解决方案确实O(n)
.
首先,请注意主循环中的 if 子句最多发生 n
次(每个 i
的值最多发生一次)。
此外,else
子句也出现了 O(n)
次,因为如果一个值已经在它的位置上,你就永远不会再改变它的位置(由 if 条件保证)。
因此,在主循环中,if
子句最多有 n
个条目,else
子句最多有 n
个条目,给出此循环的总 运行 时间 O(n)
。
第二个循环(未嵌套在第一个循环中)也是 O(n)
,因此总复杂度为 O(n)