Leetcode 540. Single Element in a Sorted Array

题目链接:Single Element in a Sorted Array

题目大意:给你一个有序数组,里面只有一个数只出现一次,其他数只出现两次,要求你找到这个数,要求复杂度为O(logn)

题目思路:数组有序,且要求复杂度是Log,所以可以很容易的想到使用二分,每次二分的判断条件可以使用这样一个问题,如果当前数与前后都不相同,那么这个数就是我们要找的数,如果他与后面一个树相同,那么我们可以通过它后面数的个数来判断,如果后面的长度为偶数,那么后面必然没有单独的一个数,不然这个长度一定为奇(其他数都是两个,偶对),与前面相同类似,所以可以通过这样的方法作为二分的判断,具体看代码

时间复杂度&&空间复杂度:O(logn)&&O(1)

class Solution {
public:
    int singleNonDuplicate(vector<int>& nums) {
        int len = nums.size();
        int left = 0,right = len,mid;
        while(left <= right){
            mid = (left+right)/2;
            //cout<<"mid = "<<mid<<endl;
            if(mid < len-1&&nums[mid] == nums[mid+1]){
                if((len-mid)%2 == 0) right = mid-1;
                else left = mid+1;
            }
            else if(mid > 0&&nums[mid] == nums[mid-1]){
                if((mid+1)%2 == 0) left = mid+1;
                else right = mid-1;
            }
            else{
                return nums[mid];
            }
        }
        return -1;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值