这道题可以有多种做法:介绍两种常规的。
第一种比较容易想到,对于nums=[1,2,3,4,5,6,7]和k=3,进行k次循环,每次循环中只将最后一个元素移动到数组的第一个位置,其余元素向后移一位。所以总时间复杂度为O(kn),思路比较简单,但提交到Leetcode会提示超时。代码如下:
class Solution(object):
def rotate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: None Do not return anything, modify nums in-place instead.
"""
k = k % len(nums)
if k == 0:
return
for i in range(0,k):
temp=nums[-1]
for j in range(len(nums)-1,0,-1):
nums[j]=nums[j-1]
nums[0]=temp
return None
所以我要介绍第二种做法,数组翻转。比如nums=[1,2,3,4,5,6,7]和k=3,将nums根据k分为两段,[1,2,3,4]和[5,6,7],然后分别翻转为[4,3,2,1]和[7,6,5]。然后总的进行翻转,得到[5,6,7,1,2,3,4]。我是通过评论才知道可以这么做的,加油。
class Solution(object):
def rotate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: None Do not return anything, modify nums in-place instead.
"""
def reverse(nums,start,end):
while(start<end):
temp=nums[start]
nums[start]=nums[end]
nums[end]=temp
start+=1
end-=1
k = k % len(nums)
reverse(nums,0,len(nums)-1-k)
reverse(nums,len(nums)-k,len(nums)-1)
reverse(nums,0,len(nums)-1)