LeetCode-540. 有序数组中的单一元素

1、题目描述:

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

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

你设计的解决方案必须满足 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

2、代码:

错误的代码

class Solution
{
public:
    int singleNonDuplicate(vector<int>& nums)
    {
        int left = 0, right = nums.size() - 1, mid;
        while (left < right) {
            mid = left + (right - left) / 2;
            if (mid % 2 == 0) {
                if (nums[mid] == nums[mid + 1]) {
                    left = mid + 1;
                }
                else {
                    right = mid - 1;  //error
                }
            }
            else {
                if (nums[mid] == nums[mid - 1]) {
                    left = mid + 1;
                }
                else {
                    right = mid - 1;
                }
            }
        }
        return nums[left];
    }
};

 正确的代码

class Solution {
public:
    int singleNonDuplicate(vector<int>& nums) {
        // 初始化左右指针,分别指向数组的起始和末尾
        int left = 0, right = nums.size() - 1, mid;

        // 当左指针小于右指针时,继续二分查找
        while (left < right) {
            // 计算中间索引,避免溢出使用 left + (right - left) / 2
            mid = left + (right - left) / 2;

            // 判断 mid 的奇偶性
            if (mid % 2 == 0) { // 如果 mid 是偶数
                // 检查当前元素是否与其后一个元素相同
                if (nums[mid] == nums[mid + 1]) {
                    // 如果相等,说明左侧(包括 mid)均为成对元素,单独元素在右侧
                    left = mid + 1;
                } else {
                    // 如果不相等,说明单独元素可能在左侧(含 mid),调整右边界
                    right = mid;
                }
            } else { // 如果 mid 是奇数
                // 检查当前元素是否与其前一个元素相同
                if (nums[mid] == nums[mid - 1]) {
                    // 如果相等,说明左侧(包括 mid)均为成对元素,单独元素在右侧
                    left = mid + 1;
                } else {
                    // 如果不相等,说明单独元素可能在左侧,调整右边界
                    right = mid - 1;
                }
            }
        }

        // 当循环结束时,left 和 right 相遇,此时指向的就是单独元素
        return nums[left];
    }
};

 为什么错了?

因为单独元素的位置必定是偶数序列,所以当 mid 为偶数且 nums[mid] != nums[mid+1] 时,错误地将 right 设为 mid-1,从而排除了可能包含单独元素的中间位置。正确的做法应将 right 设为 mid,以确保搜索范围包含当前 mid


3、解题思路:

注:因为数组是有序的,所以相同的元素肯定是相邻的。而那个单一的元素会出现的位置,可能在某个偶数索引的位置,单独元素出现之前,所有的元素都是两两出现的,且偶数索引和奇数索引的元素相同。比如,索引0和1相同,2和3相同,等等。而一旦出现了一个单独的元素,那么之后的元素对会被打乱。所以,二分查找的关键在于,通过中间元素的位置,判断当前这对是否是正常的。如果是,则说明问题出在后面;否则,问题出在前面。

  1. 初始化 :设置左右指针分别指向数组的起始和末尾。
  2. 循环条件 :当左指针小于右指针时,计算中间指针。
  3. 判断中间元素的奇偶性
    • 如果中间索引是偶数,检查该元素是否与其后一个元素相同。若相同,说明左侧均为成对元素,移动左指针;否则,右侧可能存在单独元素,调整右指针。
    • 如果中间索引是奇数,检查该元素是否与其前一个元素相同。若相同,说明左侧均为成对元素,移动左指针;否则,调整右指针。
  4. 终止条件 :当左右指针相遇时,返回当前元素即为单独元素。也就是left < right,而且,这样写也有一个好处,那就是能确保循环只在有效范围内执行。当 leftright 相遇时,循环终止,此时直接返回 nums[left],避免出现数组越界问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/981729.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Netty笔记3:NIO编程

Netty笔记1&#xff1a;线程模型 Netty笔记2&#xff1a;零拷贝 Netty笔记3&#xff1a;NIO编程 Netty笔记4&#xff1a;Epoll Netty笔记5&#xff1a;Netty开发实例 Netty笔记6&#xff1a;Netty组件 Netty笔记7&#xff1a;ChannelPromise通知处理 Netty笔记8&#xf…

MySQL-高级查询

查询处理 排序&#xff08;默认不是按主键排序的&#xff09; order by 字段1[&#xff0c;字段2] [asc|desc] 默认是升序排序也可以指定 select 列表中列的序号进行排序如果是多个字段&#xff0c;那么在上一个字段排序完的基础上排序下一个 限制数量 limit 行数&#xff0…

解决各大浏览器中http地址无权限调用麦克风摄像头问题(包括谷歌,Edge,360,火狐)后续会陆续补充

项目场景&#xff1a; 在各大浏览器中http地址调用电脑麦克风摄像头会没有权限&#xff0c;http协议无法使用多媒体设备 原因分析&#xff1a; 为了用户的隐私安全&#xff0c;http协议无法使用多媒体设备。因为像摄像头和麦克风属于可能涉及重大隐私问题的API&#xff0c;ge…

权限系统设计方案实践(Spring Security + RBAC 模型)

前言 权限系统设计基本上是所有项目中都会涉及的一个重要部分。通过权限系统&#xff0c;我们将对用户角色、功能模块访问进行限制&#xff0c;从而保证系统安全性。本文将介绍中大型项目中常用的一套权限系统设计方案&#xff0c;通过 SpringSecurity 安全管理框架&#xff0c…

数学软件Matlab下载|支持Win+Mac网盘资源分享

如大家所了解的&#xff0c;Matlab与Maple、Mathematica并称为三大数学软件。Matlab应用广泛&#xff0c;常被用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人&#xff0c;控制系统等领域。 Matlab将数值分析、矩阵计算、科学…

植物大战僵尸杂交版v3.3最新版本(附下载链接)

B站游戏作者潜艇伟伟迷于12月21日更新了植物大战僵尸杂交版3.3版本&#xff01;&#xff01;&#xff01;&#xff0c;有b站账户的记得要给作者三连关注一下呀&#xff01; 不多废话下载链接放上&#xff1a; 夸克网盘链接&#xff1a;&#xff1a;https://pan.quark.cn/s/6f2a…

GPU、NPU与LPU:大语言模型(LLM)硬件加速器全面对比分析

引言&#xff1a;大语言模型计算基础设施的演进 随着大语言模型&#xff08;LLM&#xff09;的快速发展与广泛应用&#xff0c;高性能计算硬件已成为支撑LLM训练与推理的关键基础设施。目前市场上主要有三类处理器用于加速LLM相关任务&#xff1a;GPU&#xff08;图形处理单元…

计算机网络数据传输探秘:包裹如何在数字世界旅行?

计算机网络数据传输探秘:包裹如何在数字世界旅行? 一、从快递网络看数据传输本质 想象你网购了一件商品: 打包:商家用纸箱包装,贴上地址标签(数据封装)运输:包裹经过网点→分拣中心→运输车(网络节点与链路)签收:快递员核对信息后交付(数据校验与接收)数据的网络…

VirtualBox虚拟机MacOS从Big Sur升级到Sequoia(失败)

VirtualBox虚拟机里安装好Big Sur版本&#xff0c;尝试升级到Sequoia&#xff0c;但是最终失败了。 软件升级 直接在系统偏好-软件更新里可以看到提示&#xff0c;提示可以升级到15版本Sequoia 点击同意&#xff0c;看能不能升级到Sequoia吧。升级前先用时光做了备份。 升级…

从数据到决策,永洪科技助力良信电器“智”领未来

在数字经济浪潮汹涌的时代&#xff0c;数字化转型已成为企业增强竞争力、实现可持续发展的必由之路。良信电器&#xff0c;作为国内知名的电气设备制造企业&#xff0c;积极响应时代号召&#xff0c;携手永洪科技&#xff0c;共同开启了数字化转型的新篇章。 上海良信电器股份有…

dify接入语音转文本模型后报错: microphone not authorized

遇到microphone not authorized莫慌,这是因为没有获取到设备的麦克风权限导致的 解决方法:&#xff08;三种选其一&#xff0c;我实际使用的是第三种&#xff09; 1.将http路径转换成https 2.接入的前端增加获取麦克风权限的功能 3.打开设备麦克风权限:&#xff08;能快速验证…

华为hcia——Datacom实验指南——配置手工模式以太网链路聚合

什么是以太网链路聚合&#xff08;Eth-trunk&#xff09; 是一种将多个物理链路捆绑在一起&#xff0c;让设备以为是一条大链路&#xff0c;能够增加带宽&#xff0c;增加冗余度&#xff0c;提升可靠性&#xff0c;实现负载平衡。 传输方式有两种 基于数据流传输和基于数据包…

【随手笔记】利尔达NB模组

1.名称 移芯EC6263GPP 参数 指令备注 利尔达上电输出 [2025-03-04 10:24:21.379] I_AT_WAIT:i_len2 [2025-03-04 10:24:21.724] LI_AT_WAIT:i_len16 [2025-03-04 10:24:21.724] [2025-03-04 10:24:21.733] Lierda [2025-03-04 10:24:21.733] [2025-03-04 10:24:21.745] OK移…

RNN实现精神分裂症患者诊断(pytorch)

RNN理论知识 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09; 是一种 专门用于处理序列数据&#xff08;如时间序列、文本、语音、视频等&#xff09;的神经网络。与普通的前馈神经网络&#xff08;如 MLP、CNN&#xff09;不同&#xff0c;RNN…

阿里万相,正式开源

大家好&#xff0c;我是小悟。 阿里万相正式开源啦。这就像是AI界突然开启了一扇通往宝藏的大门&#xff0c;而且还是免费向所有人敞开的那种。 你想想看&#xff0c;在这个科技飞速发展的时代&#xff0c;AI就像是拥有神奇魔法的魔法师&#xff0c;不断地给我们带来各种意想…

json介绍、python数据和json数据的相互转换

目录 一 json介绍 json是什么&#xff1f; 用处 Json 和 XML 对比 各语言对Json的支持情况 Json规范详解 二 python数据和json数据的相互转换 dumps() : 转换成json loads(): 转换成python数据 总结 一 json介绍 json是什么&#xff1f; 实质上是一条字符串 是一种…

250301-OpenWebUI配置DeepSeek-火山方舟+硅基流动+联网搜索+推理显示

A. 最终效果 B. 火山方舟配置&#xff08;一定要点击添加&#xff09; C. 硅基流动配置&#xff08;最好要点击添加&#xff0c;否则会自动弹出所有模型&#xff09; D. 联网搜索配置 E. 推理过程显示 默认是没有下面的推理过程的显示的 F. SearXNG配置 注意&#xff1a;此…

Linux中死锁问题的探讨

在 Linux 中&#xff0c;死锁&#xff08;Deadlock&#xff09; 是指多个进程或线程因为竞争资源而相互等待&#xff0c;导致所有相关进程或线程都无法继续执行的状态。死锁是一种严重的系统问题&#xff0c;会导致系统资源浪费&#xff0c;甚至系统崩溃。 死锁的定义 死锁是指…

【Go】Go viper 配置模块

1. 配置相关概念 在项目开发过程中&#xff0c;一旦涉及到与第三方中间件打交道就不可避免的需要填写一些配置信息&#xff0c;例如 MySQL 的连接信息、Redis 的连接信息。如果这些配置都采用硬编码的方式无疑是一种不优雅的做法&#xff0c;有以下缺陷&#xff1a; 不同环境…

ffmpeg源码编译支持cuda

1.安装cuda CUDA Toolkit 11.3 Downloads | NVIDIA Developer 在选择组件的时候&#xff0c;将CUDA中的Nsight VSE和Visual Studio Integration取消勾选 不然会安装失败 2.编译ffmpeg 把cuda编译宏定义开启&#xff0c;再编译avcodec 3.编译livavutil报错struct "Cuda…