个人技术分享

题目链接

题目:

分析:

  • 解法一: 哈希表
  • 解法二: 直接遍历
  • 解法三: 位运算
  • 解法四: 高斯求和公式(数学)
  • 但是上述的解法, 时间复杂度都是O(n)
  • 解法五: 二分查找
  • 观察: 以示例一为例: 消失的数字是4, 其左边0, 1, 2, 3 对应的下标也是0, 1, 2, 3, 值等于下标, 其右边5, 对应的下标是4, 值大于下标, 所以具有"二段性", 可以使用二分查找
  • 如果mid == records[mid] 说明消失的数字在右边, 移动左指针left = mid + 1
  • 如果mid < records[mid], 说明消失的数字的下标可能是mid, 也可能在mid左边, 移动右指针right = mid
  • 所以匹配二分查找算法的模版二, mid = left + (right-left) / 2
  • 处理细节: 如果最后缺失的数字是最后一个数字, 左右指针在最后一个位置相遇, 并不是最终的结果, 那么应该返回+1的位置

代码:

class Solution {
    public int takeAttendance(int[] records) {
        int left = 0;
        int right = records.length - 1;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (mid == records[mid])
                left = mid + 1;
            else
                right = mid;
        }
        if (records[left] == left)//处理细节
            return left + 1;
        return left;
    }
}