解 旋转数组

简介: 解 旋转数组

题目:

给定一个数组,将数组中的元素向右移动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;
}
相关文章
|
9月前
|
存储
【剑指offer】-左旋转字符串-41/67
【剑指offer】-左旋转字符串-41/67
|
9月前
|
算法 Python
leetcode-189:旋转数组
leetcode-189:旋转数组
40 0
|
C++
剑指offer 53. 数组中的逆序对
剑指offer 53. 数组中的逆序对
91 0
剑指offer 53. 数组中的逆序对
|
机器学习/深度学习 C++
剑指offer 66. 左旋转字符串
剑指offer 66. 左旋转字符串
88 0
|
算法 Python
Leedcode 两数、三数、四数之和总结
Leedcode 两数、三数、四数之和总结
156 0
Leedcode 两数、三数、四数之和总结
|
Java Python
左旋转字符串(剑指offer 58-II)
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
|
算法 Java
左旋转字符串 (剑指Offer58-II)
左旋转字符串 (剑指Offer58-II)
122 0
|
算法
【算法】剑指offer-杨氏数组&&旋转数组
剑指offer-杨氏数组&&旋转数组
113 0
|
算法
LeetCode 189. 旋转数组
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
80 0