C++ 程序在数组右旋转 K 次后查找第 M 个元素

data structurec++programming

右旋转意味着我们必须将每个元素向右移动,因为第 0 个索引元素移到第 1 个索引,第 1 个索引元素移到第 2 个索引,...,最后一个元素移到第 0 个索引。这里我们给出了一个大小为 n、整数 m 和整数 k 的整数数组。我们的任务是在数组右旋转 k 次后找到第 m 个元素。

以下是一些示例和说明,可帮助您理解该问题。

示例

输入

数组:[ 1, 3, 2, 5, 6, 7 ],
k: 2,
m: 4

输出

3

说明:第一次右旋转:[ 7, 1, 3, 2, 5, 6 ]

第二次右旋转:[ 6, 7, 1, 3, 2, 5 ]

数组第 2 次(第 k 次)右旋转的第 4 个(第 m 个)元素是 3。

输入

数组:[ 6, 8, 9 ],
k: 1,
米:1

输出

9

解释:第一次右旋转:[ 9, 6, 8 ]

数组第一次(第 k 次)右旋转的第 1 个(第 m 个)元素为 9。

简单方法

这种方法的思路很简单,首先,我们计算给定数组的第 k 次右旋转,然后打印该右旋转数组的第 m 个元素。

让我们看下面的代码以更好地理解上述方法。

示例

C++ 程序用于在数组进行 K 次右旋转后查找第 M 个元素。

#include <bits/stdc++.h>
using namespace std;

// 数组左旋转ele
void leftRotation(int n, int array [], int ele){
   reverse (array, array + ele);
   reverse (array + ele, array + n);
   reverse (array, array + n);
}
// 将数组右旋转 ele
void rightRotation(int n, int array [], int ele){
    leftRotation(n, array, n - ele);
}
// 创建一个函数来查找第 m 个元素并返回它
int findMthElement(int n, int array [], int k, int m){
    // 调用 rightRotation 函数将给定数组旋转 k 次
    for (int i=1; i<=k; i++) {
        rightRotation(n, array, 1);
    }
    // 返回右旋转 k 次后的最终第 m 个元素
    return array[m - 1];
}
int main(){
    int array [] = { 1, 3, 2, 5, 6, 7 }; //给定数组
    int n = sizeof(array) / sizeof(array [0]); //获取数组的大小
    int k = 2; //给定整数k
    int m = 4; //给定整数m
    int mthElement = findMthElement(n, array, k, m);
    cout << "数组第k次右旋转后的第m个元素为:";
    cout<< mthElement;
    return 0;
}

输出

数组第 k 次右旋转后的第 m 个元素为:3

时间和空间复杂度

上述代码的时间复杂度为 O(n * k),因为我们将大小为 n 的数组旋转了 k 次。

上述代码的空间复杂度为 O(1),因为没有使用额外的空间。

数学方法

在这种方法中,我们使用了数学。数学的概念是数组与 n(数组大小)旋转后相同。因此,我们可以说第 k 次旋转与 k%n 次旋转相同。

因此,我们转换 k = k%n,现在我们确定 k 的大小小于 n(n 数组的大小)。

如果 m 大于等于 k,则答案为给定数组的 (n-k) + (m-1) 个元素。

如果 m 小于 k,则答案为给定数组的 (m-1-k) 个元素。

为了进一步理解上述方法,让我们看看下面的代码。

示例

C++ 程序在数组右旋转 K 次后查找第 M 个元素

#include <bits/stdc++.h>
using namespace std;

// 创建一个函数来查找第 m 个元素并返回它
int findMthElement(int n, int array [], int k, int m){
    // 好像 k 大于数组 n 的大小
    k = k % n;
    // 创建 mthElementIndex 来存储第 m 个元素的索引
    int MthElementIndex;
    if (k < m) {
        MthElementIndex = (m - k - 1);
    } else {
        MthElementIndex = (n - k) + (m - 1);
    }
    int mthElement = array [MthElementIndex]; // 存储最终答案
    return mthElement;
}
int main (){
    int array [] = { 1, 3, 2, 5, 6, 7 }; //给定数组
    int n = sizeof(array) / sizeof(array [0]); //获取数组的大小
    int k = 2; //给定整数 k
    int m = 4; //给定整数 m
    int mthElement = findMthElement(n, array, k, m);
    cout << "数组第 k 次右旋转后的第 m 个元素为: ";
    cout<<mthElement;
    return 0;
}

输出

数组第 k 次右旋转后的第 m 个元素为:3

时间和空间复杂度

上述代码的时间复杂度为 O(1)。

上述代码的空间复杂度为 O(1)。

结论

在本教程中,我们实现了一个 C++ 程序来查找数组 K 次右旋转后的第 M 个元素。我们实现了两种方法:朴素方法和数学方法。时间复杂度分别为 O(n*k) 和 O(1)。其中 n 是数组的大小,k 是给定的 k 个整数。两种方法的空间复杂度均为 O(1)。


相关文章