0~n-1中缺失的数字

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int findLossNumber(vector<int> testVec)
{
	//二分法查找丢失的数字,先定义查找区间
	int left = 0;
	int right = testVec.size() - 1;

	while (left <= right)
	{
		int mid = left + (right - left) / 2;

		if (testVec[mid] == mid)
		{
			//如果mid下标所在位置的值testVec[mid]与下标的值相等,
			//那么在这个位置之前的所有数据是完整的,不缺失的,缺失的数字在mid下标后面的部分,
			//继续去mid后面部分寻找
			left = mid + 1;
		}
		else
		{
			//如果mid下标所在位置的值testVec[mid]与下标的值不相等,
			//那么在这个位置之前的所有数据很有可能是不完整的,尝试去mid前的区间寻找
			//继续去mid前面部分寻找
			right = mid - 1;
		}
	}

	//通过实际数据画图分析,出了while循环后,left = right + 1; 而且此时,left所指向的就是那个缺失的元素
	//而且看上面的逻辑,假象一种情况,当left和right相遇时,如果mid指的元素是缺失的,right会向右移动,那么left指向的就是丢了的元素
	//如果mid指的元素不是缺失的,那么left会向左移动,right指向的必定时不丢的,
	//综上,结果返回left即可,最好的理解方式还是画图用二分的思路找一下即可发现结果就是left的指向
	return left;
}

int main()
{
	vector<int> testVec = { 0, 1, 3};

	int result = findLossNumber(testVec);

	cout << "丢失的数字是:" << result << endl;

	vector<int> testVec2 = { 0, 1, 2, 3, 4, 5, 6, 7, 9};

	result = findLossNumber(testVec2);

	cout << "丢失的数字是:" << result << endl;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值