Leetcode189轮转数组

189. 轮转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例 1:

1
2
3
4
5
6
>输入: nums = [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]

示例 2:

1
2
3
4
5
>输入:nums = [-1,-100,3,99], k = 2
>输出:[3,99,-1,-100]
>解释:
>向右轮转 1 步: [99,-1,-100,3]
>向右轮转 2 步: [3,99,-1,-100]

提示:

  • 1 <= nums.length <= 105
  • -231 <= nums[i] <= 231 - 1
  • 0 <= k <= 105

进阶:

  • 尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。
  • 你可以使用空间复杂度为 O(1)原地 算法解决这个问题吗?

注意本题没有保证 k 小于数组长度 n。由于轮转 n 次等于没有轮转,轮转 n+1 等于轮转 1 次,依此类推,轮转 k 次等于轮转 kmodn 次。

image-20240828135403201

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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(i,j):
while i < j :
nums[i],nums[j] = nums[j],nums[i]
i += 1
j -= 1
n = len(nums)
k %= n #轮转 k 次等于轮转 kmodn 次。
reverse(0, n-1)
reverse(0, k-1)
reverse(k, n-1)