LeetCode 540. Single Element in a Sorted Array

LeetCode 540. Single Element in a Sorted Array (有序数组中的单一元素)

题目

链接

https://leetcode-cn.com/problems/single-element-in-a-sorted-array/

问题描述

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

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

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

示例

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

提示

1 <= nums.length <= 10^5

0 <= nums[i] <= 10^5

思路

由题意,一共有奇数个数,排练为 偶,奇,偶,奇,这样,最后一个数为奇数。

如果全部取异或,可以直接得到答案,或者是遍历,但是这样都是O(n)。

采用二分方法,可以更快。

  1. l为0,r为长度减一,这二者是数组下标,m为二者中间值。
  2. 获取m,若为奇数,则往前一位,若为偶数,直接运算。
  3. nums[m]和后一位数进行判断,相同的话,就代表插入位置在m+2到r中,不同的话,就是在l到m中。
  4. 最后得到结果。

复杂度分析

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

代码

Java

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