【算法】数组元素循环右移k位,并要求只用一个元素大小的附加存储,元素移动或交换次数为O(n)

devtools/2024/12/23 0:48:03/

两种写法思路: 

思路一:三次倒置


前言:C/C++函数 reverse 是 左闭右开区间的,作用是将指定范围数组元素全部倒置,数组从 0 开始,这里主要讲解思路,就直接用 函数 reverse 简化过程


 


这个方法 实现 时间复杂度为 O(n)  空间复杂度为 O(n) (空间复杂度包括 数组 arr)

 reverse(arr.begin(), arr.begin()+n);reverse(arr.begin(), arr.begin() + k);reverse(arr.begin() + k, arr.begin() + n);

思路:先把 数组 arr 全部倒置,再把 前 k 个元素 倒置,最后再把  从 k+1 ~ n-1 的 元素倒置(也就是剩下的元素)
  

1.首先,将整个数组 arr 进行反转。即将数组 arr 中的元素 arr[0] 至 arr[n-1] 倒序排列。

        例如,数组 arr 为[1, 2, 3, 4, 5],反转后的数组 arr 为 [5, 4, 3, 2, 1]。

2.接下来,将数组an的前k个元素进行反转。

        例如,数组 arr 为[5, 4, 3, 2, 1],k 为 2,则反转后的数组an为[4,5,3,2,1]。

3.再然后,将数组an的后n-k个元素进行反转。

        例如,数组 arr 为[4, 5, 3, 2, 1],n 为 5,k 为 2,则反转后的数组an为[4, 5, 1, 2, 3]。

思路二:本质在 题目说 元素向右移动 k 位,等价于 元素向左移动 n - k 位

int t = 0;  // 利用题目给的:只用一个元素大小的附加存储
for (int i = 0; i < n - k; ++i) {  // n - k 次t = arr[0]; // 每次保存 首位元素for (int j = 0; j < n; ++j) {  // 每轮 元素向左 移动一位:这样会覆盖 第一个元素,则 变量 t 作用就体现出来了:保存每轮首位元素arr[j] = arr[j + 1];}arr[n - 1] = t; // 将最后一个位置 放上  t :代表每轮第一个元素 到了 最后,实现移动
}

但是 思路二 的时间复杂度是 O(nk) 好像不符合题目,所以我就写了 思路一 作为 我的正解,本思路作为 拓展

具体代码实现:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 100;
int n, k;
vector<int>arr(N);  // C++的向量容器:类似C语言的数组signed main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> n >> k;// 初始化数组为 1 2 3 4 5for (int i = 0; i < n; ++i) {arr[i] = i + 1;}// 思路一:三次倒置reverse(arr.begin(), arr.begin()+n);reverse(arr.begin(), arr.begin() + k);reverse(arr.begin() + k, arr.begin() + n);// 思路二:本质:题目说 元素向右移动 k 位,等价于 元素向左移动 n - k 位int t = 0;  // 利用题目给的:只用一个元素大小的附加存储for (int i = 0; i < n - k; ++i) {  // n - k 次t = arr[0]; // 每次保存 首位元素for (int j = 0; j < n; ++j) {  // 每轮 元素向左 移动一位:这样会覆盖 第一个元素,则 变量 t 作用就体现出来了:保存每轮首位元素arr[j] = arr[j + 1];}arr[n - 1] = t; // 将最后一个位置 放上  t :代表每轮第一个元素 到了 最后,实现移动}for (int i = 0; i < n; ++i) {cout << arr[i] << ' ';}return 0;
}

【若文章有什么错误,欢迎评论区讨论或私信指出】


http://www.ppmy.cn/devtools/1758.html

相关文章

第10章 物理安全要求

10.1 站点与设施设计的安全原则 假如没有对物理环境的控制&#xff0c;任何管理的、技术的或逻辑的访问控制技术都无法提供足够的安全性。 如果怀有恶意的人员获取了对设施及设备的物理访问权&#xff0c;那么他们几乎可以为所欲为&#xff0c;包括肆意破坏或窃取、更改数据。…

Scala详解(3)

Scala 函数 柯里化(Currying) 柯里化指的是将多个参数的函数变成接收单一参数的过程 案例 package com.fesco.method ​ object MethodDemo1 { ​def main(args: Array[String]): Unit { ​// 定义一个函数&#xff1a;获取两个数字中较大的那个数字// 基本函数/*def max(a…

重磅!Meta 发布 Llama 3,前所未有的强大功能和多模态能力|TodayAI

Meta今日宣布推出其最新一代尖端开源大型语言模型Llama 3。该模型预计很快将在多个领先的云服务平台上线&#xff0c;包括AWS、Databricks、Google Cloud、Hugging Face、Kaggle、IBM WatsonX、Microsoft Azure、NVIDIA NIM和Snowflake。 Llama 3模型得到了AMD、AWS、Dell、In…

【ElasticSearch】安装(bug篇)

以下解决办法参考自网友们的分享 1. JDK绑定问题 但其实这样也没有问题&#xff0c;因为内嵌的jdk版本与当前的es版本是适配的 但是&#xff0c;如果内嵌的jdk与当前es不适配&#xff0c;那就要修改配置文件 / 添加环境变量&#xff0c;让es启动的时候能扫描到我们本地的jdk …

MySQL——全文检索

不是所有的数据表都支持全文检索 MySQL支持多种底层数据库引擎&#xff0c;但是并非所有的引擎支持全文检索 &#xff0c;目前最常用引擎是是MyISAM和InnoDB&#xff1b;前者支持全文检索&#xff0c;后者不支持。 booolean模式操作符 实验&#xff1a; 表productnotes &…

硬件设备杂记——12G SDI及 AES67/EBU

常见的 SDI线缆规格&#xff0c;HD-SDI又被称为1.5G-SDI&#xff0c;具体参数以秋叶原的参数为例 AES67/EBU 目前音频网络标准主要集中在OSI网络体系的第二层和第三层。 第二层音频标准的弊端在于构建音频网络时需要专用的交换机&#xff0c;无法利用现有的以太网络&#xff0c…

用Amazon Bedrock上最新模型Claude3 Opus制作网页小游戏

2024年4月16日&#xff0c;亚马逊云科技官方发布Anthropic Claude系列最强模型 Claude 3 Opus现已在Amazon Bedrock平台上正式可用&#xff0c;这一更新对于亚马逊云科技的用户和开发者们来说是个重大的好消息。因为企业云端应用可以更便捷、安全地集成Claude 3 Opus的API&…

Excel 解析工具类实现Demo,通过XSSFSheetXMLHandler使用实现

文章目录 一、功能概述二、BigExcelAnalysisUtil类三、SheetRuleUtil 类其他SheetContentsHandler 使用讲解 一、功能概述 可以校验表头以sheet维度&#xff0c;读取数据可以根据反射&#xff0c;自动把excel中的数据封装到bean主要使用了OPCPackage、XSSFReader、XSSFSheetXM…