当前位置: 首页 > 科技观察

从一道简单的算法题解释什么叫做O(1)

时间:2023-03-15 20:22:12 科技观察

今天有同学在粉丝群里问一道算法题:对话中的题目是这样的:题目要求从一个有序数组nums个元素中原地删除重复出现的地方,使得每个元素只出现一次。返回删除后数组的长度。不能使用额外的数组空间,使用O(1)空间复杂度。这位同学之所以犯错,是因为他没有理解什么是O(1)空间复杂度。他实际上在第3行生成了一个新列表,这个列表的长度取决于原来列表的长度。原列表中不重复的元素越多,新列表就会越长,所以它的空间复杂度是O(n)。而且,标题要求“就地”修改原始列表,而不是生成新列表。先说说什么叫O(1)空间复杂度。并不是说只能申请1个变量,而是说你额外申请的变量个数是恒定的,不会根据输入的列表元素个数而改变。所以,即使你申请了10000个变量,不管原始输入列表是1个元素还是1亿个元素,你总是只用到这10000个变量,所以可以说空间复杂度是O(1)。先说说什么叫原地修改。也就是说,您直接修改输入列表,而无需另外使用新列表。我们知道在Python中,向列表中添加一个元素使用xxx.append(yy),根据索引从列表中删除一个元素xxx.pop(index)都是原地修改。回到这道题,这道题属于LeetCode以上的简单级别。如果你想应聘比较好的互联网公司,这种问题应该很容易出。这道题的关键是原来的列表是有序列表,所以重复的数字一定要连在一起。因此,我们只需要一个一个地检查当前元素是否与前一个元素相同,如果相同则移除当前元素,如果不同则检查下一个元素。因此,让我们编写代码:classSolution:defremoveDuplicates(self,nums):ifnotnums:return0last=Noneindex=0length=len(nums)whileindex