C++之面试题(4)

题目描述

来源:牛客网

对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。

给定一个整数数组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;
posted @ 2020-12-25 16:04  mohist  阅读(82)  评论(0编辑  收藏  举报