题目描述
来源:牛客网
对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。
给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
思路
- 因为是升序,首先想到的是折半查找
- 第一次找到后,只需要继续向前寻找即可。
完整源码
#include <iostream>
using namespace std;
template< typename T>
int find_frist_pos(T arr[], int len, T find)
{
if (0 > len || nullptr == arr)
return -1;
//
if (find > arr[len - 1])
return -1;
if (find < arr[0])
return -1;
int left = 0;
int right = len - 1;
// 记录上一次的位置
int pre_pos = -1;
while (left < right)
{
int mid = (left + right) / 2;
if (arr[mid] > find)
{
right = mid - 1;
}
else if (arr[mid] < find)
left = mid + 1;
else
{
// 找到后向,前遍历看是否有相同
while (mid >= 0 && arr[mid] == find)
--mid;
return mid + 1;
}
}
return pre_pos;
}
int main()
{
int arr[] = { 1, 2, 2, 3, 3 };
int ret = find_frist_pos(arr, sizeof(arr) / sizeof(int), 2);
std::cout << ret << "\n\n";
return 0;
}
关键代码
// 找到后向,前遍历看是否有相同
while (mid >= 0 && arr[mid] == find)
mid--;
return mid + 1;