二分法,套二分法框架即可
二分法 伪代码。。。
int left = 0, right = a.length - 1; while (left <= right) { int mid = left + ((right - left) >> 1); if (a[mid] == mid) { return mid; }else if(a[mid] > mid){ right = mid - 1; }else if(a[mid] < mid){ left = mid + 1; } } return -1;
这里的思路是
- 下标也是值, a[index] 一定等于 index
- 如果中间缺失的话 。 a[index] > index 值了,值就一定会在左边。
- 不断缩小左边范围,右边范围, 最后左边跟右边下标相等就是缺失的值
按照这个思路写出如下代码
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 找缺失数字 * @param a int整型一维数组 给定的数字串 * @return int整型 */ public int solve(int[] a) { int left = 0, right = a.length - 1; while (left <= right) { int mid = left + ((right - left) >> 1); // 如果相等 一定是在右边 。因为缺失则会 a[index] > index if (a[mid] == mid) { left = mid + 1; //缩小左边范围 }else if(a[mid] > mid){ right = mid - 1; // 缩小右边范围 }else if(a[mid] < mid){ //这里是套模板 left = mid + 1; } } return left; }