python 将数组向右旋转k步

hiz5n14c  于 6个月前  发布在  Python
关注(0)|答案(2)|浏览(60)

给定一个整数数组nums,将数组向右旋转k步,其中k是非负的。
范例:
输入:nums = [1,2,3,4,5,6,7],k = 3
输出:[5,6,7,1,2,3,4]
说明:
[001 pdf 1st-31 files]向右旋转1步:[7,1,2,3,4,5,6]
[001 pdf 1st-31 files]向右旋转两步:[6,7,1,2,3,4,5]
[001 pdf 1st-31 files]向右旋转3步:[5,6,7,1,2,3,4]
时间复杂度为O(n),空间复杂度为O(1)。
时间复杂度为O(1),空间复杂度为O(1)。

pcww981p

pcww981p1#

这在功能上是正确的,但就我所知,它的时间复杂度既不是O(1)也不是O(n)。
为什么?为什么?时间复杂度是O(n)的,所以时间复杂度是O(n)的。
如果我们忽略可能发生的事情“在封面下”,它是O(1)的[额外的]空间复杂度。

def rotate(lst, k):
    for _ in range(k):
        lst.insert(0, lst.pop())
    return lst

print(rotate([1,2,3,4,5,6,7], 3))

字符串
如果你不关心额外的空间,你应该能够实现O(1)的时间复杂度:

def rotate(lst, k):
    return lst[-k:] + lst[:k+1]

输出(两种情况下):

[5, 6, 7, 1, 2, 3, 4]

2ekbmq32

2ekbmq322#

你可以使用一个临时变量来保存正在移动的值,并从一个目标位置到另一个目标位置遍历索引(使用模来环绕列表的大小):

def rotInPlace(A,k):
    v,i = A[0],k
    for _ in A:
        v,A[i] = A[i],v
        i = (i+k)%len(A)

字符串
输出量:

nums = [1,2,3,4,5,6,7]
k = 3

rotInPlace(nums,k)

print(nums)
# [5, 6, 7, 1, 2, 3, 4]

相关问题