#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;
}