540. 有序数组中的单一元素

exiaohu 于 2022-02-14 发布

题目链接:540. 有序数组中的单一元素

二分查找,迭代实现。输入序列的长度总为奇数,那么这个序列总具有一个中值:

from typing import List


class Solution:
    def singleNonDuplicate(self, nums: List[int]) -> int:
        l, r = 0, len(nums) - 1
        while l + 1 < r:
            m = (l + r) // 2
            if nums[m - 1] != nums[m] != nums[m + 1]:
                return nums[m]
            elif nums[m - 1] == nums[m]:
                if (m - 1 - l) & 1 == 0:
                    l = m + 1
                else:
                    r = m - 2
            else:
                if (m - l) & 1 == 0:
                    l = m + 2
                else:
                    r = m - 1

        return nums[l]