leetcode - 189. Rotate Array

Description

Given an integer array nums, rotate the array to the right by k steps, where k is non-negative.

Example 1:

复制代码
Input: nums = [1,2,3,4,5,6,7], k = 3
Output: [5,6,7,1,2,3,4]
Explanation:
rotate 1 steps to the right: [7,1,2,3,4,5,6]
rotate 2 steps to the right: [6,7,1,2,3,4,5]
rotate 3 steps to the right: [5,6,7,1,2,3,4]

Example 2:

复制代码
Input: nums = [-1,-100,3,99], k = 2
Output: [3,99,-1,-100]
Explanation: 
rotate 1 steps to the right: [99,-1,-100,3]
rotate 2 steps to the right: [3,99,-1,-100]

Constraints:

复制代码
1 <= nums.length <= 10^5
-2^31 <= nums[i] <= 2^31 - 1
0 <= k <= 10^5

Follow up:

复制代码
Try to come up with as many solutions as you can. There are at least three different ways to solve this problem.
Could you do it in-place with O(1) extra space?

Solution

Solved after help...

For a space o ( 1 ) o(1) o(1) solution, one straightforward way is: start with 0, use current value to set the new index, and then update the current value with the original value in the new index, and keep going until we replaced all the numbers.

This works for most cases, but doesn't work when k = k % n, for example, when n=4 and k=2, if we start with 0, then we jump to 2, then we jump back to 0. This could create a loop.

To avoid this loop, before starting, we should keep track of where we started, and once we found we arrived at start again, we increase start by 1 and keep going.

Time complexity: o ( n ) o(n) o(n)

Space complexity: o ( 1 ) o(1) o(1)

Code

python3 复制代码
class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        k %= len(nums)
        rotate_cnt = 0
        start = 0
        while rotate_cnt < len(nums):
            new_index, value_to_set = start, nums[start]
            while True:
                new_index = (new_index + k) % len(nums)
                ori_value = nums[new_index]
                nums[new_index] = value_to_set
                value_to_set = ori_value
                rotate_cnt += 1
                if new_index == start:
                    break
            start += 1
相关推荐
橘子汽水1688 分钟前
Leetcode 23,543合并K个升序链表,二叉树的直径
算法·leetcode·链表
Re.不晚3 小时前
挑战做100道力扣算法- DAY1
算法·leetcode·职场和发展
青山木4 小时前
Hot 100 --- 搜索插入位置
java·数据结构·算法·leetcode
星轨初途7 小时前
LeetCode 热题 100——day2 字母异位词分组
c++·算法·leetcode
雪碧聊技术10 小时前
力扣 72. 编辑距离——动态规划经典例题
算法·leetcode·动态规划
木井巳11 小时前
【DFS解决floodfill算法】岛屿的最大面积
java·算法·leetcode·深度优先
Tisfy11 小时前
LeetCode 1406.石子游戏 III:递归(DFS+记忆化) / 递推(DP+原地滚动)
leetcode·游戏·深度优先·dfs·题解·博弈
yyds_yyd_1008611 小时前
877. 石子游戏(2026.08.02)& 486. 预测赢家(2026.08.01)
c++·leetcode
宵时待雨13 小时前
优选算法专题11:栈
算法·leetcode·职场和发展
普通攻击往后拉1 天前
Leetcode 206. 反转链表
算法·leetcode·链表