1806. 还原排列的最少操作步数

news2024/11/15 18:41:35

解法一:

根据题目的题目描述进行模拟,遇到偶数 i i i a r r [ i ] = p r e m [ i / 2 ] arr[i] = prem[i/2] arr[i]=prem[i/2],遇到奇数 i i i,将 a r r [ i ] = p r e m [ ( n − 1 + i ) / 2 ] arr[i]=prem[(n-1+i)/2] arr[i]=prem[(n1+i)/2]

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2), 最多会循环n次
  • 空间复杂度: O ( n ) O(n) O(n)
class Solution {
    public int reinitializePermutation(int n) {
        int[] prem = new int[n], arr = new int[n];
        for (int i = 0; i < n; i++) prem[i] = i;
        int i, step = 1;
        while (true) {
            for (i = 0; i < n; i++) arr[i] = i % 2 == 0 ? prem[i / 2] : prem[(n - 1 + i) / 2];
            for (i = 0; i < n && arr[i] == i; i++); 
            if (i == n) return step;
            for (i = 0; i < n; i++) prem[i] = arr[i];
            step++;
        }
    }
}
class Solution {
public:
    int reinitializePermutation(int n) { 
        vector<int> prem(n), arr(n);
        for (int i = 0; i < n; i++) prem[i] = i;
        int i, step = 1;
        while (true) {
            for (i = 0; i < n; i++) arr[i] = i % 2 == 0 ? prem[i / 2] : prem[(n - 1 + i) / 2];
            for (i = 0; i < n && arr[i] == i; i++); 
            if (i == n) return step;
            for (i = 0; i < n; i++) prem[i] = arr[i];
            step++;
        }
    }
};

解法二:模拟优化

对于解法一来说我们枚举了所有位置进行交换,但其实我们不用枚举所有位置。通过分析可以发现,所有的数交换后会构成一个环,每个环经过它长度的交换后就回会到最初的状态,那么我们求出最大的环的长度(可以发现必然是所有环的最小公倍数),经过在这个长度的交换,所有数必然回到最初的位置。
在这里插入图片描述

从观察可以发现,1或者n-2必然在最长的环中,因此我们模拟1或者n-2进行交换的次数就是最终的答案。

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)
class Solution {
    public int reinitializePermutation(int n) { 
        int i = 1, step = 1;
        while (true) {
            i = i % 2 == 0 ? i / 2 : (n - 1 + i) / 2;
            if (i == 1) return step;
            step++;
        } 
    }
}
class Solution {
public:
    int reinitializePermutation(int n) { 
        int i = 1, step = 1;
        while (true) {
            i = i % 2 ? (n - 1 + i) / 2 : i / 2;
            if (i == 1) return step;
            step++;
        } 
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/150464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx反向代理使用方法小总结

文章目录一、前言二、反向代理定义重申三、短网址方式代理四、多级域名方式代理五、通配符代理方式总结一、前言 本文只介绍代理转发到一个主机的方式&#xff0c;至于在代理时进行负载均衡大家需要自己尝试&#xff0c;也比较简单&#xff0c;在本专栏前面文章提到过&#xf…

(二)Redis概述与安装

目录 一、概述 1、特性 2、应用场景 二、安装 三、启动 1、前台启动&#xff08;不推荐&#xff09; 2、后台启动&#xff08;推荐&#xff09; 四、redis关闭 五、redis相关知识介绍 一、概述 1、特性 Redis是一个开源的key-value存储系统。和Memcached类似&#x…

TOOM舆情分析监控管理系统集成,舆情监控系统监测那些人群?

当前&#xff0c;互联网已成为思想文化信息的集散地和社会舆论的扩大器&#xff0c;舆情监控新闻、论坛博客、聚合新闻等等&#xff0c;做好舆情监控&#xff0c;至于监测那些人群&#xff0c;舆情分析监控是非常必要的&#xff0c;接下来我们简单了解TOOM舆情分析监控管理系统…

接口协议之抓包分析 TCP 协议

TCP 协议是在传输层中&#xff0c;一种面向连接的、可靠的、基于字节流的传输层通信协议。环境准备对接口测试工具进行分类&#xff0c;可以如下几类&#xff1a;网络嗅探工具&#xff1a;tcpdump&#xff0c;wireshark代理工具&#xff1a;fiddler&#xff0c;charles&#xf…

《移动通信》多章节部分重要习题(简答、单选、判断)

调制技术在移动通信中的作用&#xff1f; 调制有两个目的: 1 )经过调制可以使基带信号变换为带通信号。选择需要使用的载波频率 ( 简称载频 ) ,可以把信号的频谱从开始的频段转移到到所需要的频段上,从而使传输信号适应信道的要求,或是可以把许多个输入信号合起来应用于多路传…

开发模型 和 测试模型 详解

开发模型 开发模型 &#xff1a; ① 瀑布模型 ② 螺旋模型 ③ 增量模型 和 迭代模型 ④ 敏捷模型 (优点 缺点 适用场景)测试模型 &#xff1a; ① V模型 ② W模型瀑布模型优点/特点&#xff1a;线性结构&#xff0c;每个阶段 只执行一次是其他模型的一个基础框架缺点&#xff1…

sentinel-Roadmap(三)

Pages 60 Sentinel 官方网站 OpenSergo 微服务治理 文档 Read Me新手指南Sentinel 介绍FAQRoadmap如何使用工作原理流量控制集群流控&#xff08;分布式流控&#xff09;网关流控熔断降级热点参数限流系统自适应限流黑白名单控制实时监控数据动态规则控制台生产环境使用 Sent…

Spring依赖注入时,创建代理bean和普通bean详解

问题来源 以前一直有个疑惑&#xff0c;为什么我创建的controller中注入的service类有时候是代理类&#xff0c;有时候是普通javabean&#xff0c;当时能力不够&#xff0c;现在已经有了点经验就大胆跟了跟源码&#xff0c;看看到底咋回事。 首先看看问题现象&#xff1a; a1…

linux nfs umount报错:device is busy

执行nfs卸载命令umount /mnt&#xff0c;报错target is busy. 或device is busy可以按以下步骤检查&#xff1a;退出要卸载挂载的目录&#xff0c;再执行卸载挂载cd ../umount /mnt找出占用目录的端口&#xff0c;kill端口fuser -m /mnt/kill -9 端口umount /mnt停止nfs服务&am…

PCA 主成分分析-清晰详细又易懂

PCA&#xff08;Principal Component Analysis&#xff09;通过线性变换将原始数据变换为一组各维度线性无关的表示&#xff0c;可用于提取数据的主要特征分量&#xff0c;常用于高维数据的降维。 当然我并不打算把文章写成纯数学文章&#xff0c;而是希望用直观和易懂的方式叙…

Java char[]数组转成String类型(char to String)详细介绍

前言 string toCharArray() 方法将给定的字符串转换为字符序列 Java中字符串转换为字符数组的方法在之前的博客已经介绍了&#xff01; 今天介绍char[]数组转成String 方法有4种&#xff1a; 使用 String 类的 valueOf() 方法使用字符串连接使用 Character 类的 toString() 方…

图形编辑器:场景坐标、视口坐标以及它们之间的转换

大家好&#xff0c;我是前端西瓜哥。 图形编辑器的坐标系有两种。 一个是场景&#xff08;scene&#xff09;坐标系&#xff0c;一个是 视口&#xff08;viewport&#xff09;坐标系。视口就是场景的一个子区域。 假设我们的视口的原点&#xff0c;离场景原点的坐标水平和垂直…

C2芯片一ESP32-C2开发板

C2是一个芯片采用4毫米x 4毫米封装&#xff0c;与272 kB内存。它运行框架&#xff0c;例如ESP-Jumpstart和ESP造雨者&#xff0c;同时它也运行ESP-IDF。ESP-IDF是Espressif面向嵌入式物联网设备的开源实时操作系统&#xff0c;受到了全球用户的信赖。它由支持Espressif以及所有…

月报总结|Moonbeam 12月份大事一览

本月&#xff0c;针对生态和项目&#xff0c;Moonbeam基金会启动首期Accelerator Program孵化计划&#xff0c;将针对入选团队提供一系列扶持资源&#xff0c;申请仍在开放中。对于开发者&#xff0c;Moonbuilders Academy上线了关于构建跨链应用的新课程。 社区活动方面&…

【案例分析】汽车制造行业电能质量治理方案分析

摘要&#xff1a;现如今的汽车制造行业&#xff0c;使用的机械设备越来越精密&#xff0c;制造技术与自动化水平也越来越高&#xff0c;为此对供电系统的电能质量要求更高更苛刻&#xff0c;同时对不能满足现有生产工艺需求的供电质量进行治理。通过分析汽车制造过程中冲压工艺…

连续三年!Fortinet再次位列《 Gartner 企业级有线和无线局域网基础设施魔力象限报告》“远见者”

网络安全领导者Fortinet&#xff08;NASDAQ&#xff1a;FTNT&#xff09;&#xff0c;近日宣布连续第三年入围《Gartner企业级有线和无线局域网基础设施魔力象限报告》“远见者”象限。这一殊荣源于Fortinet 旗下FortiSwitch 和 FortiAP等有线和无线局域网产品组合的强劲实力&a…

激光焊接薄板时需要注意的一些问题

焊接是目前工业制造中必要的工艺技术&#xff0c;焊接金属时需要注意很多方面的问题&#xff0c;本文主要针对金属薄板焊接中的一些工艺问题进行展开讨论。例如&#xff1a;焊缝的牢固程度、焊缝的平整度、焊缝直线度的控制、焊缝高度和宽度的控制以及焊接的均匀性等方面。 一、…

程序员们有什么好的编程习惯?

优良的代码显然不是制作优秀软件的唯一要素&#xff0c;但是主要的要素之一。我们可能拥有世界上最好的产品和营销团队&#xff0c;部署了最好的平台&#xff0c;并以最好的框架来构建软件&#xff0c;但归根结底&#xff0c;一款软件所做的一切&#xff0c;都是因为有人写了一…

LeetCode 49 字母异位词分组 | 解题思路分享

原题链接&#xff1a;49. 字母异位词分组 - 力扣&#xff08;LeetCode&#xff09; 题目难度&#xff1a;中等 题目描述 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的字母得到的一个新单词…

分析快、易操作的数据分析工具推荐

数据分析工具发展这么多年&#xff0c;该有的技术功能都有了&#xff0c;该提高的数据分析效率、数据分析量等也都提高了&#xff0c;但很多长期奋战在一线的数据分析人员却总是抱怨数据分析工具响应慢、分析慢、越来越容易崩溃。为什么要找一款分析快、易操作的数据分析工具还…