郑州建设网站的公司,短视频推广策略,网站后台英文,公司做网站的流程作图的步骤两种写法思路#xff1a; 思路一#xff1a;三次倒置 前言#xff1a;C/C函数 reverse 是 左闭右开区间的#xff0c;作用是将指定范围数组元素全部倒置#xff0c;数组从 0 开始#xff0c;这里主要讲解思路#xff0c;就直接用 函数 reverse 简化过程 这个方法 实现 …
两种写法思路 思路一三次倒置 前言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 个元素 倒置最后再把 从 k1 ~ 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 为 5k 为 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) 好像不符合题目所以我就写了 思路一 作为 我的正解本思路作为 拓展 具体代码实现
#includebits/stdc.h
#define int long long
using namespace std;
const int N 100;
int n, k;
vectorintarr(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;
} 【若文章有什么错误欢迎评论区讨论或私信指出】