问题:一个数组前一部分为递增、后一部分为递减,求这个数组的最大值。
解决:1、全局遍历找最大值,时间复杂度为O(n);
2、采用二分查找,时间复杂度为O(logn);
int find_max(int* arr,int n)
{
//n 为数组的长度
if (n == 1)
{
return arr[0];
}
int left = 0;
int right = n-1;
while (left < right)
{
int mid = (left + right) / 2;
if (arr[mid] >= arr[mid - 1] && arr[mid] >= arr[mid + 1])
{
return arr[mid];
}
else if (arr[mid] >= arr[mid + 1])
{
right = mid;
}
else if (arr[mid] <= arr[mid + 1])
{
left = mid;
}
}
}
问题:一个单调递增数组中,求目标值所在的位置。
解决:1、遍历查找
2、二分查找
int find_value(int* arr,int n,int value)
{
int left = 0;
int right = n-1;
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] == value)
{
return mid;
}
else if (arr[mid] > value)
{
right = mid-1;
}
else if (arr[mid] < value)
{
left = mid+1;
}
}
}
int find_value(int* arr,int n,int value)
{
int left = 0;
int right = n-1;
while (left < right)
{
int mid = (left + right) / 2;
if (arr[mid] == value)
{
return mid;
}
else if (arr[mid] > value)
{
right = mid;
}
else if (arr[mid] < value)
{
left = mid;
}
}
}
问题:一个递增数组,求目标值出现的第一个位置
解决:1、遍历循环
2、二分查找
int found_value(int* arr,int n,int value)
{
int left = 0;
int right = n-1;
int mid = 0;
while (left < right)
{
mid = (left + right) / 2;
if (mid == left)
break;
if (arr[mid] < m)
{
left = mid;
}
else if (arr[mid] >= m)
{
right = mid;
}
}
return right;
}