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

news2024/11/15 12:49:44

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

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

你设计的解决方案必须满足 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 <= 105
0 <= nums[i] <= 105

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/single-element-in-a-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

写了几个样例在纸上找了下规律,找到规律之后遍摸清楚了每一步需要判断的边界,例子如下:

有这样一个数组 : 1  1  2  2  3  3  4  5  5  6  6   7   7   8   8

对应位置的下标 : 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14

经观察可以发现:

1> 在我们要找的数字之前:

  • 奇数索引位置与其前一个位置的数值相等;
  • 偶数索引位置与其后一个位置的数值相等;

2> 在我们要找的数字之后:

  • 奇数索引位置与其后一个位置的数值相等;
  • 偶数索引位置与其前一个位置的数值相等;

 既然发现了规律我们就能判断目标位置在当前mid左侧还是右侧,首先判断当前mid是奇索引还是偶索引,如果是奇索引就判断其与前一个位置是否相等,如果相等,说明mid在目标位置左侧,反之在右侧。如果是偶索引,就判断其与后一个位置的数值是否相等,相等,说明mid在目标位置左侧,反之在右侧,直至跳出循环。

思路是这样,但写出代码之后有一些特殊情况并未考虑,导致有的测试用例无法通过,根据观察,有以下几种情况,有时是单一元素出现在数组边界,即最左侧和最右侧,有时是最中间,通过一步步改代码判断这些特殊情况,最后是全部通过,但比较麻烦也不好记忆,题解的方法貌似规避了这种问题。

代码如下:

class Solution {
    public int singleNonDuplicate(int[] nums) {
        int l = 0;
        int h = nums.length - 1;
        while (l <= h) {
            int mid = l + (h - l) / 2;
            if (mid % 2 == 0) {
                if (mid == h || mid == l) {
                    return nums[mid];
                }
                if (nums[mid] == nums[mid + 1]) {
                    l = mid + 1;
                } else {
                    if (nums[mid] != nums[mid - 1]) {
                        return nums[mid];
                    }
                    h = mid - 1;
                }
            } else {
                if (mid == l) {
                    if (mid == 0)
                        return nums[l];
                }
                if (nums[mid] == nums[mid - 1]) {
                    l = mid + 1;
                } else {
                    h = mid - 1;
                }
            }
        }
        return nums[l];
    }
}

 

方法二:

每次都判断偶数位置,如果是奇数就-1将其变成偶数位置,那么要考虑的情况就少了很多,只需判断当前位置和下一位置是否相等,相等则在目标位置左侧,不等则在右侧。

代码如下:

class Solution {
    public int singleNonDuplicate(int[] nums) {
        int l = 0;
        int h = nums.length - 1;
        if (h == 0) {
            return nums[0];
        }
        while (l <= h) {
            int mid = l + (h - l) / 2;
            if (mid % 2 != 0) {
                mid -= 1;
            }
            if(mid==nums.length-1){
                return nums[mid];
            }
            if (nums[mid] == nums[mid + 1]) {
                l = mid + 2;
            } else {
                h = mid - 1;
            }
        }
        return nums[l];
    }
}

这种写法还是有很多判断,要减少那些判断,可以将答案锁定在l出现的位置,那么将while循环设置为(l<h)就一定出现在l位置,同时也避免了要判断数组溢出的情况

代码如下:

public int singleNonDuplicate(int[] nums) {
    int l = 0, h = nums.length - 1;
    while (l < h) {
        int m = l + (h - l) / 2;
        if (m % 2 == 1) {
            m--;   // 保证 l/h/m 都在偶数位,使得查找区间大小一直都是奇数
        }
        if (nums[m] == nums[m + 1]) {
            l = m + 2;
        } else {
            h = m;
        }
    }
    return nums[l];
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“开发人员必备技能:Python接口自动化测试全攻略“:了解接口测试的基础知识,并通过Python编写测试用例,提升自己的测试技能

目录 摘要 一、基础知识 二、工具选择 三、实现步骤 1.安装依赖库 2.编写测试用例 3.运行测试用例 4.查看测试结果 四、代码实现 总结 摘要 随着互联网行业的不断发展&#xff0c;越来越多的企业开始注重自动化测试的重要性。而在自动化测试中&#xff0c;接口自动化…

同为科技(TOWE)防雷科普篇(二)——雷击灾害急救方法大全

前 言 当雷击发生时&#xff0c;空气中的各种微粒互相碰撞和摩擦便会使该空气介质两面的正负电荷的量持续积累&#xff0c;这时加于该空气介质的电压也会同时增加&#xff0c;当局部电压达到当时条件下空气的击穿电压时&#xff0c;该空气介质的局部便会发生电击穿而持续成为等…

我国激光打标机行业分析:防疫放开医疗行业激光打标机需求迫切 行业将迈向自动化、智能化的未来

1、激光打标机行业定义、分类及应用范围 激光打标机是用激光束在各种不同的物质表面打上永久标记的激光设备。激光打标技术相比传统的标识技术&#xff0c;不仅仅在对于材料的损耗&#xff0c;标识效果更具有优势&#xff0c;并且在生产加工的效率和产出方面更是有过之而无不及…

【复现与代码分析】Apache APISIX Dashboard API权限绕过导致RCE(CVE-2021-45232)

Apache APISIX Dashboard API权限绕过导致RCE&#xff08;CVE-2021-45232&#xff09; 0x00漏洞信息 Apache APISIX 是一个动态、实时、高性能的 API 网关&#xff0c; 提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。Apache APISIX …

节点流和处理流

节点流可以从一个特定的数据源读写数据&#xff0c;如FileReader&#xff0c;FileWriter处理流&#xff08;也叫包装流&#xff09;是“连接”在已存在的流&#xff08;节点流或处理流&#xff09;之上&#xff0c;为程序提供更为强大的读写功能&#xff0c;也更加灵活&#xf…

JavaEE IP协议详细讲解

详细讲解IP协议 O > O 文章目录 JavaEE & IP协议1. 地址管理1.1 IP协议报文格式1.2 动态分配IP地址1.3 NAT机制1.4 IP协议1.4 IP协议工作过程1.5 IPV6协议1.6 IP地址的组成1.7 特殊的IP地址 2. 路由选择 JavaEE & IP协议 1. 地址管理 我们希望&#xff0c;每个网络…

免费AI人工智能在线写作伪原创-百度ai自动写文章

免费伪原创洗稿工具 免费伪原创洗稿工具现在终于推出了&#xff01;你是否在写作的时候&#xff0c;经常因为缺乏灵感而苦恼&#xff1f;或者&#xff0c;你在撰写文章的时候&#xff0c;发现自己的语言表述不够丰富&#xff0c;缺乏变化&#xff0c;语句重复率太高&#xff1f…

从零学习SDK(9)SDK的局限

SDK是一种便捷而实用的工具&#xff0c;但软件开发者不能视SDK为万能的解决之道&#xff0c;SDK也有局限性&#xff0c;并且这些局限性可能会十分“致命”。软件开发者在选择SDK产品之前&#xff0c;需要先了解SDK的不足之处。本文将介绍SDK存在的三种问题&#xff0c;以引起软…

新手必看!ChatGPT常见问题总整理,你遇到了几个?

随着ChatGPT火爆全球,使用人数以指数型成长,许多使用上的问题呈现在网路上。 今天这篇文章会用实作的方式带大家了解ChatGPT有哪些常见问题,以此减少踩坑的机会。 并用简单的示例让大家感受GPT-3.5与GPT-4的能力差异,希望对大家有所帮助。 大家会有这些问题,其实就是希望…

【手把手做ROS2机器人系统开发一】开发环境搭建

【手把手做ROS2机器人系统开发一】开发环境搭建 目录 【手把手做ROS2机器人系统开发一】开发环境搭建 一、专栏介绍&#xff1a; 二、开发环境搭建&#xff1a; 1.Ubuntu系统安装 2.ROS2系统环境安装 3.测试系统运行 一、专栏介绍&#xff1a; 大家好&#xff0c;今天给大家…

哈希表企业应用-淘宝分布式文件系统核心存储引擎

哈希表企业应用-淘宝分布式文件系统核心存储引擎-基本概述 淘宝网 谁都知道 是一个电子商务网站,可能是第一批电商模式 b2c 当然从一个技术人员讲只有一点 淘宝店铺商品存储到哪里 感觉有点像废话 :肯定在仓库里 不,我说的是 :商品详情页以及商品介绍 存储 在哪里 我知道大家都…

【图论】弗洛伊德Floyd算法模板及实战(LeetCode743)

文章目录 框架实战 Floyd-Warshall算法本质是一种动态规划&#xff0c;可以用于解决任意两点间的最短路径&#xff08;多源最短路径问题&#xff09;&#xff0c;支持负权&#xff0c;而Dijkstra算法则不支持负权。 框架 第一步&#xff1a; 定义s[i][j]存储i到j的(最短)路径长…

字典树/前缀树Trie(附Java代码)

字典树/前缀树 1.字典树Trie1.1 字典树举例 2.代码实现2.0 代码结构2.1方式一&#xff1a;使用数组存储孩子节点2.2方式二&#xff1a;使用HashMap存储孩子节点 在计算机科学中&#xff0c;trie&#xff0c;又称前缀树或字典树&#xff0c;是一种有序树&#xff0c;用于保存关联…

一文带你上高速入门linux(含常用命令语法、说明、举例)

一文带你入门linux常用命令&#xff08;含举例和详细说明&#xff09; Linux系统操作介绍1. Linux发行版2. Linux文件系统3. Linux基本命令4. Linux用户和权限管理5. 软件包管理6. 系统管理7. 网络管理8. Shell脚本9. 文本处理10. 系统监控和日志11. 总结 Linux系统操作介绍 L…

塔望3W消费战略全案丨品类重新定义 打造金皇品高端速食第一面

金皇品 客户&#xff1a;上海皇品食品有限公司 品牌&#xff1a;金皇品 服务&#xff1a;3W消费战略 品牌全案 项目背景 金皇品隶属于上海皇品食品有限公司&#xff0c;品牌创立于1995年。产品以原汁作为核心卖点&#xff0c;通过线下渠道的密集耕耘&#xff0c;在浙江&…

NPM 发包 js 文件并支持 ts 使用(包含 gulp 打包压缩)

主篇 npm 上传发布自定义组件以及使用详细流程。 npm login 报错&#xff1a;Unexpected token < in JSON at position 0 while parsing near ‘<!DOCTYPE HTML PUBLI…’。 登录 npm $ npm login Username: dengzemiao Password: Email: (this IS public) xxxx163.co…

【李宏毅】GNN学习笔记

视频链接 [TA 補充課 Graph Neural Network (1/2) (由助教姜成翰同學講授) - YouTube] [TA 補充課 Graph Neural Network (2/2) (由助教姜成翰同學講授) - YouTube] [speech.ee.ntu.edu.tw/~tlkagk/courses/ML2020/GNN.pdf] Introduction 应用&#xff1a;分类、Generatio…

Docker 快速入门

1、Docker 简介 Docker是一个开源的容器引擎&#xff0c;它可以帮助我们更快地交付应用。Docker可将应用程序和基础设施层隔离&#xff0c;并且能将基础设施当作程序一样进行管理。使用Docker&#xff0c;可更快地打包、测试以及部署应用程序&#xff0c;并可减少从编写到部署…

mysql主从复制搭建--待实践完善

一、什么是mysql主从复制 参考链接&#xff1a;MySQL主从介绍_rain_yunlx的博客-CSDN博客 Linux下搭建Mysql主从复制详细步骤&#xff08;Mysql版本5.7.35&#xff09;_linuxmysql主从_Direct_的博客-CSDN博客 Linux环境MySQL数据库主从复制保姆级教程_linux主从复制_小学生…

山东大学2023操作系统实验2

目录 (1)操作系统实验2内容: (2)完成方式: (3)使用函数和功能: 1.pipe函数与有关的功能 2.pipe的返回值 3.pipe的参数 4.使用事项: (4)实现代码 (5)实现效果 (1)操作系统实验2内容: 创建三个并行的进程,分别完成计算F(x),F(y),F(x,y)三个函数的计算 (2)完成方式: 实验…