Leetcode 面试150题 189. 轮转数组 中等

系列博客目录


文章目录

  • 系列博客目录
  • [189. 轮转数组 中等](#189. 轮转数组 中等)
  • [示例 1](#示例 1)
  • [示例 2](#示例 2)
  • 解答

189. 轮转数组 中等

链接

描述

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

示例 1

bash 复制代码
输入: 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

bash 复制代码
输入: nums = [-1, -100, 3, 99], k = 2
输出: [3, 99, -1, -100]
解释: 
向右轮转 1 步: [99, -1, -100, 3]
向右轮转 2 步: [3, 99, -1, -100]

提示

  • 1 <= nums.length <= 10^5
  • -2^31 <= nums[i] <= 2^31 - 1
  • 0 <= k <= 10^5

进阶

尽可能想出更多的解决方案,至少有 三种不同的方法 可以解决这个问题。

你可以使用 空间复杂度为 O(1)原地算法 来解决这个问题吗?


解答

一开始认为只要新建一个数组,然后根据k把原数组的值先在新数组中填到对应的位置即可,然后把新数组的值赋值到原数组即可。

java 复制代码
class Solution {
    public void rotate(int[] nums, int k) {
        int[] result = new int[nums.length];
        for (int i = k; i < result.length; i++) {
            result[i] = nums[i-k];
        }
        for (int i = 0; i < k; i++) {
            result[i] = nums[nums.length-k+i];
        }
        for (int i = 0; i < nums.length; i++) {
            nums[i] = result[i];
        }
    }
}

后来,发现k可能比数组长度大,那样的话上面i-k肯定会超范围。以为添加如下代码在前面即可。但是其实不对,比如nums = [1, 2, 3, 4, 5, 6, 7], k 为8和9,他是不一样的。

java 复制代码
if(nums.length<=k){
   return;
}

然后就修改为了,根据k,分成k步,每次把最后面插入到最前面。但是OJ(online judge)会超时间限制"Time Limit Exceeded"(TLE)。后来发现,其实如果k大于数组的长度,k的前面数组长度部分对数组的操作其实是没必要的,相当于一步一步不断从最后插入第一个,操作了一轮,实则没有变化。

最后得到了自己的答案如下。

java 复制代码
class Solution {
    public void rotate(int[] nums, int k) {
        int[] result = new int[nums.length];
        int index=k%nums.length;
        for (int i = index; i < result.length; i++) {
            result[i] = nums[i-index];
        }
        for (int i = 0; i < index; i++) {
            result[i] = nums[nums.length-index+i];
        }
        for (int i = 0; i < nums.length; i++) {
            nums[i] = result[i];
        }
    }
}
相关推荐
隐语SecretFlow几秒前
隐语SecreFlow:如何全面提升MPC多方安全学习的性能?
算法
王国强200923 分钟前
什么是算法复杂度?
算法
夏鹏今天学习了吗27 分钟前
【LeetCode热题100(54/100)】全排列
算法·leetcode·深度优先
緈福的街口38 分钟前
gps的定位图,在车的位置去寻找周围20x20的区域,怎么确定周围有多少辆车,使用什么数据结构
数据结构·算法
江塘1 小时前
机器学习-KNN算法实战及模型评估可视化(C++/Python实现)
开发语言·c++·人工智能·python·算法·机器学习
炫饭第一名2 小时前
🌍🌍🌍字节一面场景题:异步任务调度器
前端·javascript·面试
艾莉丝努力练剑2 小时前
【C++:继承和多态】多态加餐:面试常考——多态的常见问题11问
开发语言·c++·人工智能·面试·继承·c++进阶
麦麦大数据2 小时前
F039 python五种算法美食推荐可视化大数据系统vue+flask前后端分离架构
python·算法·vue·推荐算法·美食·五种算法
星空露珠2 小时前
数独解题算法lua脚本
开发语言·数据结构·算法·游戏·lua
小猪咪piggy2 小时前
【算法】day14 链表
数据结构·算法·链表