【发布时间】:2021-12-14 20:42:37
【问题描述】:
我正在做一个 leetcode 问题 189. Rotate Array。
问题陈述: 给定一个数组,将数组向右旋转 k 步,其中 k 为非负数。 输入:nums = [1,2,3,4,5,6,7], k = 3 输出:[5,6,7,1,2,3,4]
以下是我的代码。我的理解是时间复杂度是 O(k),但它最终非常低。能否请您对此有所了解并教育我?
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
while k:
nums.insert(0,nums.pop())
k -= 1
【问题讨论】:
-
您可能需要考虑一种不同的方法,它不会在每一步都修改数组,但请考虑如何重新索引要像这样移动的数组。
-
非常慢是什么意思?这里没有太多会导致真正的性能问题
-
无论哪种方式 - CPython 中的列表都是作为简单的指针数组实现的,因此弹出很简单,但在 0 处插入需要将所有内容向右移动并设置第一个条目。
-
列表不适合这个
insert(0)(到头)操作。最好考虑其他方式来处理更大的列表。 -
@AlbertGLieu 不,绝对不是。对于典型的用例,链表将是灾难性的,它被实现为一个数组列表,这就是为什么访问是恒定时间的,即
mylist[0]与mylist[10_000]花费相同的时间通常,只有在默认实现时您会看到链表的地方是函数式编程语言,即“缺点列表”。