【LeetCode每日一题】——189.轮转数组

文章目录

一【题目类别】

  • 数组

二【题目难度】

  • 中等

三【题目编号】

  • 189.轮转数组

四【题目描述】

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

五【题目示例】

  • 示例 1:

    • 输入: 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:

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

六【题目提示】

  • 1 < = n u m s . l e n g t h < = 1 0 5 1 <= nums.length <= 10^5 1<=nums.length<=105
  • − 2 31 < = n u m s [ i ] < = 2 31 − 1 -2^{31} <= nums[i] <= 2^{31} - 1 −231<=nums[i]<=231−1
  • 0 < = k < = 1 0 5 0 <= k <= 10^5 0<=k<=105

七【题目进阶】

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

八【解题思路】

  • 假设需要轮转k个位置,那么我们需要进行三次翻转:
    • 第一次翻转:翻转整个数组,此时需要移动的元素已经到了数组的开始,其余元素在数组的后面
    • 第二次翻转:将第一次翻转到数组开始的k个元素翻转,这样就变成了正常的顺序
    • 第三次翻转,将第一次翻转到数组后面的剩余元素翻转,这样也变成了正常的顺序
  • 当然,我们还要合理的处理k以避免溢出
  • 该题不需要返回结果
  • 具体细节可以参考下面的代码

九【时空频度】

  • 时间复杂度: O ( n ) O(n) O(n), n n n为传入的数组的长度
  • 空间复杂度: O ( 1 ) O(1) O(1)

十【代码实现】

  1. Java语言版
java 复制代码
class Solution {
    public void rotate(int[] nums, int k) {
        // 防止溢出
        int n = nums.length;
        k %= n;
        // 第一次翻转:翻转整个数组,此时需要移动的元素已经到了数组的开始,其余元素在数组的后面
        reverse(nums, 0, n - 1);
        // 第二次翻转:将第一次翻转到数组开始的k个元素翻转,这样就变成了正常的顺序
        reverse(nums, 0, k - 1);
        // 第三次翻转,将第一次翻转到数组后面的剩余元素翻转,这样也变成了正常的顺序
        reverse(nums, k, n - 1);
    }

    // 翻转数组
    private void reverse(int[] nums, int start, int end) {
        while (start < end) {
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start++;
            end--;
        }
    }

}
  1. Python语言版
python 复制代码
class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        # 防止溢出
        k %= len(nums)
        # 第一次翻转:翻转整个数组,此时需要移动的元素已经到了数组的开始,其余元素在数组的后面
        self.reverse(nums, 0, len(nums) - 1)
        # 第二次翻转:将第一次翻转到数组开始的k个元素翻转,这样就变成了正常的顺序
        self.reverse(nums, 0, k - 1)
        # 第三次翻转,将第一次翻转到数组后面的剩余元素翻转,这样也变成了正常的顺序
        self.reverse(nums, k, len(nums) - 1)

    # 翻转数组
    def reverse(self, nums, start, end):
        while start < end:
            temp = nums[end]
            nums[end] = nums[start]
            nums[start] = temp
            start += 1
            end -= 1
  1. C语言版
c 复制代码
// 翻转数组
void reverse(int* nums, int start, int end)
{
    while (start < end)
    {
        int temp = nums[start];
        nums[start] = nums[end];
        nums[end] = temp;
        start++;
        end--;
    }
}

void rotate(int* nums, int numsSize, int k)
{
    // 防止溢出
    k %= numsSize;
    // 第一次翻转:翻转整个数组,此时需要移动的元素已经到了数组的开始,其余元素在数组的后面
    reverse(nums, 0, numsSize - 1);
    // 第二次翻转:将第一次翻转到数组开始的k个元素翻转,这样就变成了正常的顺序
    reverse(nums, 0, k - 1);
    // 第三次翻转,将第一次翻转到数组后面的剩余元素翻转,这样也变成了正常的顺序
    reverse(nums, k, numsSize - 1);
}

十一【提交结果】

  1. Java语言版

  2. Python语言版

  3. C语言版

相关推荐
m0_603888714 分钟前
Scaling Trends for Multi-Hop Contextual Reasoning in Mid-Scale Language Models
人工智能·算法·ai·语言模型·论文速览
Xの哲學7 分钟前
Linux io_uring 深度剖析: 重新定义高性能I/O的架构革命
linux·服务器·网络·算法·边缘计算
comli_cn14 分钟前
残差链接(Residual Connection)
人工智能·算法
Aaron158821 分钟前
基于VU13P在人工智能高速接口传输上的应用浅析
人工智能·算法·fpga开发·硬件架构·信息与通信·信号处理·基带工程
予枫的编程笔记23 分钟前
【论文解读】DLF:以语言为核心的多模态情感分析新范式 (AAAI 2025)
人工智能·python·算法·机器学习
im_AMBER32 分钟前
Leetcode 99 删除排序链表中的重复元素 | 合并两个链表
数据结构·笔记·学习·算法·leetcode·链表
王老师青少年编程1 小时前
信奥赛C++提高组csp-s之欧拉回路
c++·算法·csp·欧拉回路·信奥赛·csp-s·提高组
墨有6661 小时前
数学分析栈的出栈顺序:从算法判断到数学本质(卡特兰数初探)
c++·算法·数学建模
zhutoutoutousan1 小时前
氛围数学学习:用游戏化思维征服抽象数学
学习·算法·游戏
guygg881 小时前
基于捷联惯导与多普勒计程仪组合导航的MATLAB算法实现
开发语言·算法·matlab