题目描述

链接: https://leetcode-cn.com/problems/single-element-in-a-sorted-array/
给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。

示例 1:

输入: [1,1,2,3,3,4,4,8,8]
输出: 2
示例 2:

输入: [3,3,7,7,10,11,11]
输出: 10
注意: 您的方案应该在 O(log n)时间复杂度和 O(1)空间复杂度中运行。

代码(二分法):

class Solution {
    public int singleNonDuplicate(int[] nums) {
        int low = 0, high = nums.length - 1;
        while (low <= high) {
            // 防止溢出
            int mid = low + (high - low) / 2;
            // 如果左边是一样的数, mid--, 如果右面是一样的数, 不动(保持mid在同一个数的最左侧)
            if (mid-1 >= 0 && nums[mid-1] == nums[mid]) {
                mid--;
            } else if (mid+1 < nums.length && nums[mid+1] == nums[mid]) {
            } else {
                return nums[mid];
            }
            // 左侧有奇数个, 说明左侧一定有单身数字
            // 左侧有偶数个, 说明左侧没有(单身数字只有一个), 往后跳两个
            if ((mid - low) % 2 == 1) {
                high = mid - 1;
            } else  {
                low = mid + 2;
            }
        }
        return -1;
    }
}

思路:

1) 直接所有异或,最后剩下的就是单身数字, O(n)时间复杂度, O(1)空间复杂度
2) 用二分法(因为是有序数组)