leecode540:有序数组中的单一元素(最优解)

 

给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数 

 

输入: [3,3,7,7,10,11,11]
输出: 10
输入: [1,1,2,3,3,4,4,8,8]
输出: 2
class Solution {
    public int singleNonDuplicate(int[] nums) {
        int left=0;
        int right = nums.length-1;
        int m =left+(right-left)/2;
        while(left<right){
            //如果该m位置与前后都不相同,就是要找的数字;
            //否则如果目标数字在m前面,那么与【m】相同的第二个数字的下标+1一定为偶数第一个为奇数,在m后面的话则相反;
            m=left+(right-left)/2;
            if(nums[m] != nums[m-1] && nums[m] != nums[m+1]) return nums[m];
            if(nums[m-1] == nums[m]){
                if( m % 2 == 0){
                    right = m-2;
                }else{
                    left=m+1;
                }
            }else{
                if( m % 2 == 0){
                    left = m+2;
                }else{
                    right=m-1;
                }
            }
        }
        return nums[left];
        
            
    }
}

主要思路是使用二分法,然后根据中间指针的index来判断目标数字在前面还是后面,如果在后面那么前面的数字的长度肯定为偶数,在后面则前面的数字的长度为奇数。

这个时间复杂度 > 1 && < logn

点赞