原题网址:点击打开链接
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
输入:[1,2,3,4,5,6,7]
和 k = 3 输出:[5,6,7,1,2,3,4]
解释: 向右旋转 1 步:[7,1,2,3,4,5,6]
向右旋转 2 步:[6,7,1,2,3,4,5]
向右旋转 3 步:[5,6,7,1,2,3,4]
要求
- 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
- 要求使用空间复杂度为 O(1) 的原地算法。
方法一:使用临时空间(很简单,而且题目要求原地,不做解释)
方法二:逐个向前推移(在测试用例的时候有超时的可能)
def rotate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: void Do not return anything, modify nums in-place instead.
"""
l = len(nums)
k %= l
if k != 0:
for i in range(k):
j = l - 1
temp = nums[l - 1]
while j > 0:
nums[j] = nums[j - 1]
j -= 1
nums[0] = temp
方法三:类似翻转字符的方法()
class Solution:
def rotate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: void Do not return anything, modify nums in-place instead.
"""
l = len(nums)
k %= l
k1 = l - k
if k != 0:
for i in range((k1 - 1) // 2 + 1):
t1 = nums[i]
nums[i] = nums[k1 - 1 - i]
nums[k1 - 1 - i] = t1
for j in range(k1,(k1 + l - 1) // 2 + 1):
t2 = nums[j]
nums[j] = nums[l - 1 + k1 - j]
nums[l - 1 + k1 - j] = t2
nums.reverse()
解析:如下过程,先翻转前n-k个字符,在翻转后k个字符,最后将整个字符串翻转,一共三次逆置
1 2 3 4 5 6 7
4 3 2 1 5 6 7
4 3 2 1 7 6 5
5 6 7 1 2 3 4
详细解释:把s看成 两个部分,最后输出的结果是,,离散数学(后续详细补全过程)
相比上一种方法,时间复杂度为o(n)
欢迎大家一起来参与刷题:GitHub链接