leetcode 540

此题因为要求O(lgn)的算法复杂度,所以应该自然而然地想到用二分法来进行求解。我们可以发现在取到中间地值后,我们可以用这个值和两边地值进行比较,如果都不同,那么结果就是这个值。然后就要分这个值和左右两边相等的两种情况。例如,如果和左边相同,那么我们就要看左边的数组的个数是奇数还是偶数,如果是奇数的话,当我们并入中间的值,左边就成为了偶数,那么说明我们想要的结果一定是在右边,如果左边是偶数,那么并入中间的值之后,左边就成了奇数,说明我们想要的结果一定是在左边的。对于中间的值和右边的值相同的情况与上述类似。所以,我们可以分为这四种情况来递归下去,最后就得到了算法复杂度为O(nlgn)的算法。附代码:

class Solution:
    def singleNonDuplicate(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) == 1:
            return nums[0]
        pos = int(len(nums)/2)
        intermediate = nums[pos]
        if intermediate != nums[pos-1] and intermediate != nums[pos+1]:
            return intermediate
        if intermediate == nums[pos-1]:
            if pos % 2 ==0:
                return self.singleNonDuplicate(nums[:pos+1])
            else:
                return self.singleNonDuplicate(nums[pos+1:])
        if intermediate == nums[pos+1]:
            if pos % 2 ==0:
                return self.singleNonDuplicate(nums[pos:])
            else:
                return self.singleNonDuplicate(nums[:pos])

猜你喜欢

转载自blog.csdn.net/bengepai/article/details/82350278