解 旋转数组

简介: 解 旋转数组

题目:

给定一个数组,将数组中的元素向右移动k个位置,其中k是正整数。

进阶:

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

示例

image.png

解答:

思路1:一步一步进行分解

向右旋转一步时,可以将最右边的数移到第一个位置上,然后num-1向右移动一位,再嵌套循环k次。

源码:

int main()
{
int num[7] = { 1,2,3,4,5,6,7 };
int k = 0;
cin >> k;
while (k--)
  {
int tmp = num[6];
for (int i = 6; i >0; i--)
    {
num[i] = num[i - 1];//直接写-1,不需要写i--
    }//倒着写!
num[0] = tmp;
  }
for (int i=0;i<7;i++)
  {
cout << num[i] << ' ';
  }
return 0;
}

反思:

这种解法的时间复杂度是O(n*k),低效率,当数据一多,容易跑崩掉。空间复杂度是O(1)

思路2:用空间换时间

直接开辟一个新数组,将经过k次旋转的前后两个部分直接拷贝到一个新的数组里面。

image.png

反思:

时间效率提高了,但是所需要的空间变大了,首先不符合题意满足空间复杂度是O(1),其次若题目给的数据过多,空间也可能不够!

思路三:最牛的解法

image.png

这种算法的时间复杂度是O(n),空间复杂度为O(1)

该解法最核心部分是如何实现逆置

用左右下标表示前后逆置的对象,然后left++,right--,直到不满足left<right即可。

void fun(int *arr,int left,int right)//是左右数组下标
{
while (left < right)
  {
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
  }
}
int main()
{
int arr[7] = { 1,2,3,4,5,6,7 };
int k;
cin >> k;
int num = 7;
if (k > 7)
  {
num %= 7;
  }//需要判断旋转次数大于数组的长度时,数组会越界!
fun(arr,7-k,6);//后k个逆置
fun(arr,0,7-k-1);//前n-k个逆置
fun(arr,0,6);//整体逆置
for (int i=0;i<7;i++)
  {
cout << arr[i] << ' ';
  }
return 0;
}
相关文章
|
TensorFlow 算法框架/工具 异构计算
Windows部署TensorFlow后识别GPU失败,原因是啥?
Windows部署TensorFlow后识别GPU失败,原因是啥?
|
6月前
|
固态存储 C++ 计算机视觉
Windows平台GIMP 2.10下载教程:零基础入门高级图像编辑
GIMP(GNU Image Manipulation Program)是一款开源跨平台图像编辑工具,支持图层管理、高级修图、色彩校正等功能,广泛应用于平面设计和照片修复。其优势包括全功能免费、插件生态丰富(600+扩展插件)、硬件要求低(1GB内存即可流畅运行)。本文详细介绍GIMP的软件定位、安装流程、首次配置及常见问题解答,帮助用户快速上手并充分利用其强大功能。
|
11月前
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
自然语言处理 IDE 开发工具
通义灵码上新功能啦::1.0.9(VS CODE)、1.0.8(JetBrains)
通义灵码上新功能啦,代码优化新功能已就位,快用它来debug!赶紧插件市场更新最新版本:1.0.9(VS CODE)、1.0.8(JetBrains)。
621 6
三元表达式/推导式
三元表达式/推导式
91 0
|
存储 JavaScript 前端开发
一文介绍Js的数据结构
一文介绍Js的数据结构
288 0
|
前端开发 JavaScript 网络协议
HTTP初识,fiddler的使用,URL各部分介绍,QueryString
HTTP初识,fiddler的使用,URL各部分介绍,QueryString
|
安全 Go
Go 使用标准库 net/rpc 包
Go 使用标准库 net/rpc 包
138 0
|
存储 SQL 关系型数据库
MySQL数据库:数据库的约束以及数据的聚合、联合查询
MySQL数据库:数据库的约束以及数据的聚合、联合查询
322 0