二分查找

对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。
给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
测试样例:
[1,3,5,7,9],5,3
返回:1
此方法利用递归的方式,运行是在牛客网上,因为牛客网是连续输入,例如静态变量在一个案例返回的时候必须重新设置为0,否则会出现错误,导致下一个案例仍然在上一个案例的基础上继续使用
#include 
   
   
    
    
#include 
    
    
     
     
using namespace std;
int getPos(vector
     
     
      
       A, int n, int val) {
	// write code here
	static int count = 0;
	int m = A[n / 2];
	if (n == 1 && m != val)
	{
		int ttt = count;
		count = 0;
		return -1;
	}
	else
	{
		vector
      
      
       
        front, back;
		if (m == val)
		{
			if (n == 1)
			{
				int ttt = count;
				count = 0;
				return n / 2 + ttt;
			}
			else
			{
				front.insert(front.begin(), A.begin(), A.begin() + n / 2);
				for (int i = front.size() - 1;i >= 0;i--)
				{
					if (front[i] != m)
					{
						int ttt = count;
						count = 0;
						return n / 2 + ttt - front.size() + i + 1;
					}
					if (i == 0)
					{
						int ttt = count;
						count = 0;
						return n / 2 + ttt - front.size() + i;
					}
				}
				return 0;
			}
		}
		else
		{
			if (m>val)
			{
				front.insert(front.begin(), A.begin(), A.begin() + n / 2 );
				return getPos(front, n / 2, val);
			}
			else
			{
				if (n == 2)
				{
					int ttt = count;
					count = 0;
					return -1;
				}
				else
				{
					back.insert(back.begin(), A.begin() + n / 2 + 1, A.end());
					count = count + n / 2 + 1;
					return getPos(back, (n - 1) / 2, val);
				}
			}
		}
	}
}
int main()
{
	vector
       
       
         A; int n = 5; int val = 3; A.push_back(7); A.push_back(21); A.push_back(21); A.push_back(21); A.push_back(28); A.push_back(35); A.push_back(38); cout << getPos(A, 7,38) << endl; cout << getPos(A, 7, 38) << endl; getchar(); getchar(); return 0; } 
       
      
      
     
     
    
    
   
   
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值