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
相关推荐
旖-旎3 小时前
《LeetCode647 回文子串 || LeetCode 5 最长回文子串》
c++·算法·leetcode·动态规划·哈希算法
怪兽学LLM7 小时前
LeetCode 105. 从前序与中序遍历序列构造二叉树:分治递归思路详解
算法·leetcode·职场和发展
退休倒计时8 小时前
【每日一题】LeetCode 39. 组合总和 TypeScript
算法·leetcode·typescript
Scabbards_8 小时前
面试Leetcode - Array
leetcode·面试·职场和发展
兰令水10 小时前
hot100【acm版】【2026.7.13打卡-java版本】
java·开发语言·数据结构·算法·leetcode·面试
Tisfy10 小时前
LeetCode 1291.顺次数:打表/枚举
算法·leetcode·题解·枚举·遍历
罗超驿11 小时前
双指针算法详解:从入门到精通(Java版)
算法·leetcode·职场和发展
tkevinjd11 小时前
力扣300-最长递增子序列
算法·leetcode·职场和发展·动态规划·贪心
aqiu11111114 小时前
【算法日记20】LeetCode 438. 找到所有字母异位词:定长滑动窗口的极致优雅
算法·leetcode·职场和发展
tkevinjd14 小时前
416分割等和子集
java·python·算法·leetcode·职场和发展