📌  相关文章
📜  C++ 程序查找字典顺序最小的旋转序列设置 2(1)

📅  最后修改于: 2023-12-03 14:59:49.456000             🧑  作者: Mango

C++程序查找字典顺序最小的旋转序列

本文介绍C++程序查找字典顺序最小的旋转序列的方法和实现代码。

什么是旋转序列

旋转序列是指将原序列的某些元素移到末尾后得到的新序列。例如,序列[1, 2, 3, 4, 5],将其第1个元素移到末尾得到新序列[2, 3, 4, 5, 1],则[2, 3, 4, 5, 1]是[1, 2, 3, 4, 5]的一个旋转序列。

如何查找字典顺序最小的旋转序列

要查找字典顺序最小的旋转序列,需要找到原序列的最小值所在的位置,然后将该位置之前的元素移到序列末尾即可。

例如,对于序列[4, 5, 6, 7, 1, 2, 3],最小值为1,所在位置为第5个位置。将第5个位置之前的元素[4, 5, 6, 7]移到序列末尾,得到新序列[1, 2, 3, 4, 5, 6, 7],即为字典顺序最小的旋转序列。

实现方法如下:

#include <iostream>
#include <vector>

using namespace std;

int findMin(vector<int>& nums) {
    int left = 0, right = nums.size() - 1;
    while (left < right) {
        int mid = (left + right) / 2;
        if (nums[mid] > nums[right]) {
            left = mid + 1;
        } else {
            right = mid;
        }
    }
    return left;
}

vector<int> minRotate(vector<int>& nums) {
    vector<int> result;
    int minIdx = findMin(nums);
    for (int i = minIdx; i < nums.size(); i++) {
        result.push_back(nums[i]);
    }
    for (int i = 0; i < minIdx; i++) {
        result.push_back(nums[i]);
    }
    return result;
}

int main() {
    vector<int> nums = {4, 5, 6, 7, 1, 2, 3};
    vector<int> result = minRotate(nums);
    for (int i = 0; i < result.size(); i++) {
        cout << result[i] << " ";
    }
    cout << endl;
    return 0;
}

代码中,findMin函数用于查找原序列中最小值所在的位置,使用二分查找算法实现;minRotate函数用于将原序列旋转成字典顺序最小的序列;在main函数中,我们可以使用示例测试数据来验证函数是否正确。

结论

在本文中,我们介绍了C++程序查找字典顺序最小的旋转序列的方法和实现代码。可以看出,该算法时间复杂度为$O(logn)$,空间复杂度为$O(n)$。