📅  最后修改于: 2023-12-03 15:13:45.868000             🧑  作者: Mango
在排序数组中进行旋转(比如[0,1,2,4,5,6,7]可能会变成[4,5,6,7,0,1,2]),我们需要找出旋转的次数,即数组中最小元素的索引。
暴力破解方法是先遍历数组,找到数组中最小的元素,再返回它的索引即可。代码如下:
int countRotations(int arr[], int n) {
int minIndex = 0;
for (int i = 0; i < n; i++) {
if (arr[i] < arr[minIndex]) {
minIndex = i;
}
}
return minIndex;
}
时间复杂度:O(n)
我们可以利用二分查找的思想,快速找到最小元素的索引。具体实现方法是,设定开始时的左右指针,计算中间元素的索引。将数组分为两个部分,如果中间元素小于右指针所指元素,则说明中间元素是最小元素或在其左边部分,将右指针移动到中间元素之前;反之,即右边部分存在更小的元素,则左指针移动到中间元素之后,继续寻找。
代码如下:
int countRotations(int arr[], int n) {
int left = 0, right = n-1;
while (left < right) {
int mid = left + (right-left)/2;
if (arr[mid] < arr[right]) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
时间复杂度:O(logn)
二分查找法比暴力破解的时间效率更高,尤其是在处理大型数组时。在实际应用中,我们需要根据实际情况选择不同的方法。