540. Single Element in a Sorted Array

来源:互联网 发布:把别人淘宝制成csv 编辑:程序博客网 时间:2024/05/22 06:11

Given a sorted array consisting of only integers where every element appears twice except for one element which appears once. Find this single element that appears only once.

Example 1:

Input: [1,1,2,3,3,4,4,8,8]Output: 2

Example 2:

Input: [3,3,7,7,10,11,11]Output: 10

Note: Your solution should run in O(log n) time and O(1) space.


思路: * focus on even index
 * 因为lo,hi在更新的时候求出来的mid不一定是even
 * 所以在n/2内二分

class Solution {    public int singleNonDuplicate(int[] nums) {        int lo = 0, hi = nums.length/2;        while(lo < hi) {        int mid = lo + (hi-lo) / 2;        if(nums[mid*2] == nums[mid*2+1]) // 0..2*mid+1都是ok的        lo = mid+1;        else        hi = mid;        }                return nums[2*lo];    }}

class Solution:    '''分当前index是奇数还是偶数讨论,进而判断前面有奇数个数还是偶数个数,    最后以此推测下表的变换    '''    def singleNonDuplicate(self, nums):        """        :type nums: List[int]        :rtype: int        """        lo,hi=0,len(nums)-1        while lo<hi:            mid=lo+(hi-lo)//2            if mid%2==0:                if nums[mid]==nums[mid+1]:                    lo=mid                else:                    hi=mid+2            else:                if nums[mid]==nums[mid+1]:                    hi=mid-1                else:                    lo=mid+1        return nums[lo]s=Solution()print(s.singleNonDuplicate([1,1,2,3,3,4,4,8,8]))print(s.singleNonDuplicate([3,3,7,7,10,11,11]))