一个顺序数组被左移或者右移n位,求数组中任意数字的下标

题目描述:有一个排好序的数组,例如:[1,2,3,4,5,6,7,8,9],现在将这个数组左移五位变成—[6,7,8,9,1,2,3,4,5],现在用这个得到的数组求其中任意数字的下标,例如求6的下标,返回0,要求算法的复杂度为logn。
解题方法:1.使用二分法找到断点的位置;2.从这个断点的位置开始,寻找这个数字,然后哦找到之后%size,就得到了现在这个数字的下标。

#include <iostream>
#include <vector>
using namespace std;

int findBreakPoint(const vector<int> &src)
{
	int left = 0, right = src.size() - 1;
	int mid;

	while (left <= right)
	{
		mid = (left + right) / 2;
		if (src[mid > src[mid + 1]])
		{
			return mid + 1;
		}

		if (src[left] > src[mid])
		{
			return mid + 1;
		}
		else
		{
			left = mid + 1;
		}
	}
}

int bfind(const vector<int> &src, int bp, int n)
{
	int size = src.size();
	int left = bp, right = bp + size - 1;
	int mid;

	while (left <= right)
	{
		mid = (left + right) / 2;
		if (src[mid % size] > n)
		{
			right = mid - 1;
		}
		else if (src[mid % size] < n)
		{
			left = mid + 1;
		}
		else
		{
			return mid % size;
		}
	}
}


int main()
{
	vector<int> src{ 4, 5, 6, 7, 8, 9, 1, 2, 3 };
	int bp = findBreakPoint(src);
	cout << bfind(src, bp, 6);

	return 0;
}
发布了149 篇原创文章 · 获赞 27 · 访问量 5052

猜你喜欢

转载自blog.csdn.net/qq_44783220/article/details/103008877