​LeetCode刷题实战540:有序数组中的单一元素

本文介绍了如何使用二分搜索法解决LeetCode上的有序数组中单次出现的元素问题,提供了O(logn)时间复杂度和O(1)空间复杂度的解决方案,并给出了具体的Java实现代码。通过实例解析了算法思路,帮助读者提升算法能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 有序数组中的单一元素,我们先来看题面:

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

You are given a sorted array consisting of only integers where every element appears exactly twice, except for one element which appears exactly once. Return the single element that appears only once.

Your solution must run in O(log n) time and O(1) space.

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

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

你设计的解决方案必须满足 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(log n)时间复杂度和 O(1)空间复杂度”,就应该想到“二分搜索法”。代码如下:

class Solution {
    public int singleNonDuplicate(int[] nums) {
   int left = 0;
        int right = nums.length - 1;
        while (left < right){
            int mid = left + (right - left) / 2;
            if (nums[mid] == nums[mid + 1]){ // 和u右边相等
                int c = mid - left; //mid左边个数
                if (c%2 == 0){ // 偶数个
                    left = mid + 2;
                }else{
                    right = mid - 1;
                }
            }else if (nums[mid] == nums[mid - 1]){
                int c = right - mid; // mid右边个数
                if (c%2 == 0){ // 偶数个,说明在左边
                    right = mid - 2;
                }else{ // 奇数个,说明在右边
                    left = mid + 1;
                }
            }else{ // 1,1,2,3,3, 不等于右边,也不等于右边,直接返回
                return nums[mid];
            }
        }

        return nums[left];
    }
}

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-520题汇总,希望对你有点帮助!

LeetCode刷题实战521:最长特殊序列 Ⅰ

LeetCode刷题实战522:最长特殊序列 II

LeetCode刷题实战523:连续的子数组和

LeetCode刷题实战524:通过删除字母匹配到字典里最长单词

LeetCode刷题实战525:连续数组

LeetCode刷题实战526:优美的排列

LeetCode刷题实战527:单词缩写

LeetCode刷题实战528:按权重随机选择

LeetCode刷题实战529:扫雷游戏

LeetCode刷题实战530:二叉搜索树的最小绝对差

LeetCode刷题实战531:孤独像素 I

LeetCode刷题实战532:数组中的K-diff数对

LeetCode刷题实战533:孤独像素 II

LeetCode刷题实战534:游戏玩法分析 III

LeetCode刷题实战535:TinyURL 的加密与解密

LeetCode刷题实战536:从字符串生成二叉树

LeetCode刷题实战537:复数乘法

LeetCode刷题实战538:把二叉搜索树转换为累加树

LeetCode刷题实战539:最小时间差

b9480a217a8925df1b3f06a21f61d3db.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程IT圈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值