当前位置: 首页 > article >正文

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

系列博客目录


文章目录

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


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 <= nums.length <= 10^5
  • -2^31 <= nums[i] <= 2^31 - 1
  • 0 <= k <= 10^5

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


解答

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

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,他是不一样的。

if(nums.length<=k){
   return;
}

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

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];
        }
    }
}


http://www.kler.cn/a/414342.html

相关文章:

  • vue3-setup基本使用(非响应式数据)
  • 2.mybatis整体配置
  • 【Vue】Keep alive详解
  • 40分钟学 Go 语言高并发实战:高性能缓存组件开发
  • R虚拟环境中安装ncdf4库包编译库问题
  • HiISP(一)
  • React UI设计黑色蒙层#000000 80%,首次打开弹出,点击图片可以关闭
  • Figma入门-铅笔钢笔工具
  • 大数据笔记
  • Mybatis:Mybatis快速入门
  • 如何将MinIO数据迁移到阿里云OSS
  • LLMs之ell:ell(轻量级函数式提示工程框架)的简介、安装和使用方法、案例应用之详细攻略
  • python+django自动化平台(一键执行sql) 前端vue-element展示
  • 应急响应靶机——easy溯源
  • 算法的NPU终端移植:深入探讨与实践指南
  • 豆包MarsCode算法题:三数之和问题
  • 论 AI(人工智能)的现状
  • 商汤绝影打造A New Member For U,让汽车拥有“有趣灵魂”
  • 力扣 搜索旋转排序数组-33
  • Qt UI设计 菜单栏无法输入名字
  • faiss库中ivf-sq(ScalarQuantizer,标量量化)代码解读-3
  • 自动驾驶科研资料整理
  • 【再谈设计模式】装配器模式 ~复杂结构构建的巧匠
  • 注意http-proxy-middleware要解决跨域问题,想修改origin请求头不要设置changeOrigin=true
  • DeSTSeg: Segmentation Guided Denoising Student-Teacher for Anomaly Detection
  • IPGuard与Ping32结合,提供企业级数据加密与防泄密解决方案,全面保障敏感数据安全