Rotate Array
题目
Rotate an array of n elements to the right by k steps.
For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7]
is rotated to [5,6,7,1,2,3,4].
Note:
Try to come up as many solutions as you can, there are
at least 3 different ways to solve this problem.
Hint:
Could you do it in-place with O(1) extra space?
解答
class Solution:
# @param nums, a list of integer
# @param k, num of steps
# @return nothing, please modify the nums list in-place.
def reverse(self, nums, begin, end):
while begin < end:
nums[begin], nums[end] = nums[end], nums[begin]
begin += 1
end -= 1
def rotate(self, nums, k):
l = len(nums)
t = 0 - k % l
self.reverse(nums, t, -1)
self.reverse(nums, 0 - l, t - 1)
self.reverse(nums, 0, l-1)
解释
将数组看成一个向量x=ab,那么循环右移后数组就变成ba。从向量的角度考虑
(a−1b−1)−1=ab
其中 a−1 表示数组a的逆序,来自《编程珠玑》。