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

思路:
因为题目要求时间复杂度是O(logn),所以可以思考使用二分法(二分法的时间复杂度是O(logn))。
由于题目给的是有序数组,且大多数元素出现两次,只有一个出现一次,所以这个数组的长度肯定是个奇数。所以可以使用二分法划分数组,长度为奇数的那部分数组肯定含有我们寻找的目标数值。
当我们找到了长度为奇数的部分,还要考虑吧与当前mid值相同的数值出现在mid的左边还是右边,并且还要考虑把该相同元素去除之后,这部分剩下的长度是奇数还是偶数。

代码:

class Solution {
    public int singleNonDuplicate(int[] nums) {
        int n=nums.length;
        if(n==0) return 0;
        int start=0,end=n-1;
        while(start<end){
            int mid=start+(end-start)/2;
            boolean isOdd=(end-mid)%2==0;
            if(nums[mid]==nums[mid+1]){
                if(isOdd){
                    start=mid+2;
                }else{
                    end=mid-1;
                }
            }else if(nums[mid]==nums[mid-1]){
                if(isOdd){
                    end=mid-2;
                }else{
                    start=mid+1;
                }
            }else{
                return nums[mid];
            }
        }
        return nums[start];
    }
}
posted @   Dreamer_szy  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示