python - 列表弹出和插入在python中非常慢
问题描述
我正在处理一个 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
解决方案
一种方法是使用 deque rotate
,如下所示
from collections import deque
from typing import List
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
dnums = deque(nums)
dnums.rotate(k)
nums[:] = dnums
nums = [1,2,3,4,5,6,7]
Solution().rotate(nums, 3)
print(nums)
输出
[5, 6, 7, 1, 2, 3, 4]
从文档(强调我的):
向右旋转双端队列 n 步。如果 n 为负数,则向左旋转。当 deque 不为空时,向右旋转一步相当于d.appendleft(d.pop()),向左旋转一步相当于 d.append(d.popleft())。
在列表开头插入的问题是它是 O(n),您必须移动所有元素。在开头插入的双端队列(appendleft)是 O(1)。
有关 deque 和 list 的时间复杂度的更多详细信息,请参阅here
推荐阅读
- java - 无法将类字段添加到 ArrayList
- java - @Column, @Length, @Size 在休眠中的注解 - 同时使用
- python - 尝试在 python 中使用 OpenCV 和 Tesseract 识别验证码,但准确度不高
- java - 如何在属性中将字体安装到 NetBeans?
- python - 计算链表节点
- python - 当我尝试将我的 numpy 数组保存到 .npy 文件时,出现内存错误。如何从内存有限的图像文件创建大型 .npy 文件?
- java - 如何在应用启动时验证用户购买非消耗性产品
- r - 如何在 R 中解析 lua 文件
- three.js - DeckGL 在海量点云数据可视化方面的表现如何?
- angular - 监听子组件中的更改变量