📅  最后修改于: 2023-12-03 14:59:49.456000             🧑  作者: Mango
本文介绍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)$。