题目描述:把一段升序数组向右平移n位后,可以使用logn的时间复杂度找出一个元素的位置。
eg:arr[] = {4,5,6,7,8,9,1,2,3} 输入3后可以用logn的算法找出它的位置。
分析:首先设定left = 0, right = size, mid = (left+right)/2, k 为需要查找的数;
我们需要在longn的情况下算出这道题所以我们必须使用二分查找,具体思路如下;这道题可分为以下两个情况
情况1:arr[mid] > arr[left]
情况1.1:arr[mid] > arr[left] && k > arr[mid] (第一个箭头中的k是arr[left])
情况1.2:arr[mid] > arr[left] && k < arr[mid](第一个箭头中的k是arr[left])
情况2:arr[mid] < arr[left]
情况2.1 :
arr[mid] < arr[left] && k > arr[mid] 令right = mid
情况2.2:
arr[mid] < arr[left] && k > arr[mid] && k>=arr[left] 令 right = mid
arr[mid] < arr[left] && k > arr[mid] && k<arr[left] 令left = mid
实现代码:(c++实现)
#include<iostream>
#include<vector>
using namespace std;
int FindNumber(int *arr, int right, int k)
{
int left = 0;
int mid = (left + right) / 2;
while(left < right)
{
if (arr[mid] == k)
{
return mid;
}
if (arr[mid] > arr[left])
{
if (k > arr[mid])
{
left = mid;
}
else
{
if (k >= arr[left])
{
right = mid;
}
else
{
left = mid;
}
}
}
else
{
if (k < arr[mid])
{
right = mid;
}
else
{
if (k >= arr[left])
{
right = mid;
}
else
{
left = mid;
}
}
}
mid = (left + right) / 2;
}
}
int main()
{
int arr[] = {19,23,45,76,1,4,12,16 };
cout << arr[FindNumber(arr, sizeof(arr) / sizeof(arr[0]), 23)] << endl;;
system("pause");
return 0;
}