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

【题解-力扣189. 轮转数组(java实现O(1)空间要求)】

一、题目描述

题目链接:https://leetcode.cn/problems/rotate-array/description/?envType=study-plan-v2&envId=top-100-liked

给定一个整数数组 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]

二、解题思路

  • 如果只考虑简单的方法,不考虑O(1)空间,那必然是新建一个n长度的数组res,将n-k~n的数据依次插入数组res,随后将0-n-k-1的数据插入,就完事了
  • 考虑O(1)空间,则要清楚所有的交换动作需要在数组本身上面完成。
  • 1、模拟一下,k>n/2和k<n/2的两种情况
  • 2、实际上每一次操作都是将原来数组切割成两个子数组,然后用两个子数组中长的数组剩余的数据和两个交换成功的部分的后边数据组成的子数组继续进行交换操作。
  • 3、例如:1,2,3,4,5,6,7 k=3。第一步:分割成(1,2,3,4)和(5,6.7)进行交换。第二步,数组变为(5,6,7,4,1,2,3),4作为剩余数组组成子数组(4),和(1,2,3)进行交换。第三步,数组变为(5,6,7,1,4,2,3),剩余数组组成(2,3)和(4)进行交换。第四步,数组变为(5,6,7,1,2,4,3),(3)和(4)交换,变为(5,6,7,1,2,3,4)达到理想效果。第二个案例可以用类似模拟方法得到规律。下面直接上代码。

三、代码

class Solution {
    public void rotate(int[] nums, int k) {

        k = k %  nums.length ;
        if(k == 0 ){
            return;
        }
        //思路:将数组切割成两份
        //子数组互相交换 如果有一个剩下元素的子数组
            //该剩下的子数组和之前交换成功的两个子数组其中后置数组继续交换
        f(nums,0, nums.length-k-1, nums.length-k, nums.length-1);
        
    }
    public void f(int[] nums,int op1 , int ed1 , int op2,int ed2){
    while(op1 <= ed1 && op2 <= ed2){
            int temp = nums[op1];
            nums[op1] = nums[op2];
            nums[op2] = temp;
            op1++;
            op2++;
        }
        if(op1 > ed1 && op2 > ed2){
            return;
        }
        if(op1 == ed1 + 1){
            f(nums,op1,op2-1,op2,ed2);
        }
        if(op2 == ed2 + 1) {
            f(nums,op1,ed1,ed1+1,ed2);
        }

    }
}

四、总结

这道题使用O(1)空间难度也不大,主要用下模拟法就能找到翻转的规律。只是博主困于安逸和闲适太久,很难静下心去模拟去解题,实际上静下心来专心致志地解,倒也不难。
最后,人生并非逆旅,也绝非轨道,只要还有选择的余地,朋友,你的人生就是旷野啊!共勉之。


http://www.kler.cn/news/316627.html

相关文章:

  • Python3爬虫教程-HTTP基本原理
  • 数据结构--单链表创建、增删改查功能以及与结构体合用
  • Java 入门指南:JVM(Java虚拟机)—— 双亲委派模型(Parent Delegation Model)
  • 2024短剧系统开发,付费短剧小程序app源码教程,分销功能讲解搭建上线
  • 【UI自动化】前言
  • 服务器相关问题
  • 机器学习及其应用领域【金融领域】
  • css 控制虚线刻度尺寸
  • 【手写数据库内核组件】1001词法分析器,语言被程序识别的第一步,将语句分解为最小词根token
  • Qt 模型视图(二):模型类QAbstractItemModel
  • 可智能生成刺绣图案!武汉纺织大学可视计算与数字纺织团队发布首个多缝线刺绣生成对抗网络模型,被顶级期刊 TVCG 录用
  • 后端开发刷题 | 最长无重复子数组
  • ArcGIS Pro SDK (十六)公共设施网络 1 网络管理
  • 人工智能与机器学习原理精解【22】
  • 深度学习-16-深入理解BERT基于本地数据微调训练文本分类模型的流程
  • SQL语法学习指南
  • 9月23日
  • Shiro rememberMe反序列化漏洞(Shiro-550) 靶场攻略
  • 水下攻防面试题
  • 『功能项目』QFrameWork拾取道具UGUI【69】
  • 深度学习速通系列:什么是文本数据标注
  • 《SmartX ELF 虚拟化核心功能集》发布,详解 80+ 功能特性和 6 例金融实践
  • 高级大数据开发协会
  • PHP邮件发送教程:如何用PHP发送电子邮件?
  • 4.结构型设计模式 - 第1回:引言与适配器模式 (Adapter Pattern) ——设计模式入门系列
  • Vulkan 学习(8)---- vkImageView 创建
  • 关于SpringBoot项目使用maven打包由于Test引起的无法正常打包问题解决
  • 亲测好用,ChatGPT 3.5/4.0新手使用手册~
  • 振弦式渗压计常见故障有哪些?怎么解决?
  • 探秘淘宝商品详情原数据:主图与数据的神秘获取之旅