自学内容网 自学内容网

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

给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。

请你找出并返回只出现一次的那个数。

你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。

示例 1:

输入: nums = [1,1,2,3,3,4,4,8,8]
输出: 2

示例 2:

输入: nums =  [3,3,7,7,10,11,11]
输出: 10

提示:

  • 1 <= nums.length <= 10e5
  • 0 <= nums[i] <= 10e5

 分析:根据题目要求,首先想到二分。对于当前的位置mid,如果它不是唯一出现的数,那么它的左边或者右边去掉和它相等的数字之后,一定有一边只有奇数个数字,此时进入这一边再次二分。边界条件为数组大小为1,或者mid仅出现过一次。

int getans(int *arr,int n,int l,int r)
{
    if(r==l)return arr[l];
    int mid=(l+r)/2;
    if(mid-1>=0&&mid+1<n)
    {
        int temp=arr[mid];
        if(arr[mid-1]==temp||arr[mid+1]==temp)
        {
            if(arr[mid-1]==temp)
            {
                if((mid+1-2)%2==1)return getans(arr,n,l,mid-2);
                else return getans(arr,n,mid+1,r);
            }
            else
            {
                if((mid)%2==1)return getans(arr,n,l,mid-1);
                else return getans(arr,n,mid+2,r);
            }
            
        }
    }
    return arr[mid];
}

int singleNonDuplicate(int* nums, int numsSize) {
    return getans(nums,numsSize,0,numsSize-1);
}


原文地址:https://blog.csdn.net/2401_88085478/article/details/143688433

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!