二分查找-数组中负数与正数

/*  一个数组中中间部分都是0,前半部分全是负数,后半部分都是正数,要求时间复杂度尽量低的情况下,查找最后一个负数和第一个正数。
    题目中描述的数组,求解结果是与0比较的,可以看做是有序的,使用二分查找,时间复杂度可以达到log(n)
*/
#include <vector>
#include <iostream>

using namespace std;

// 二分查找
int BinSearch(const vector<int>& vect_nums, bool is_negative)
{
	int start = 0;
	int mid = 0;
	int end = vect_nums.size() - 1;

	while (start <= end)
	{
		mid = start + (end - start) / 2;
		if (vect_nums[mid] == 0)
		{
			if (is_negative) // 查找最后一个负数
			{
				end = mid - 1;
				if (vect_nums[end] < 0)
					return vect_nums[end];
			}
			else // 查找第一个正数
			{
				start = mid + 1;
				if (vect_nums[start] > 0)
					return vect_nums[start];
			}
		}
		else if (vect_nums[mid] > 0)
		{
			end = mid - 1;
		}
		else
		{
			start = mid + 1;
		}
	}
	
	return 0;
}

pair<int, int> BinSearchNegativePositive(const vector<int>& vect_nums)
{
	return make_pair(BinSearch(vect_nums, true), BinSearch(vect_nums, false));
}

int main()
{
	vector<int> vect_nums = { -1, -2, -8, -3, -10, 0, 0, 2, 3, 11};
	pair<int, int> pair_both_num = BinSearchNegativePositive(vect_nums);
	cout << "last negative: " << pair_both_num.first << ", first positive: " << pair_both_num.second;
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章