当前位置: 首页 > news >正文

二分查找题目:有序数组中的单一元素

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法一
    • 思路和算法
    • 代码
    • 复杂度分析
  • 解法二
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:有序数组中的单一元素

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

难度

4 级

题目描述

要求

给定一个仅由整数组成的升序数组,其中每个元素都出现两次,除了一个元素只出现一次。

返回只出现一次的元素。

要求时间复杂度是 O(log n) \texttt{O(log n)} O(log n),空间复杂度是 O(1) \texttt{O(1)} O(1)

示例

示例 1:

输入: nums = [1,1,2,3,3,4,4,8,8] \texttt{nums = [1,1,2,3,3,4,4,8,8]} nums = [1,1,2,3,3,4,4,8,8]
输出: 2 \texttt{2} 2

示例 2:

输入: nums = [3,3,7,7,10,11,11] \texttt{nums = [3,3,7,7,10,11,11]} nums = [3,3,7,7,10,11,11]
输出: 10 \texttt{10} 10

数据范围

  • 1 ≤ nums.length ≤ 10 5 \texttt{1} \le \texttt{nums.length} \le \texttt{10}^\texttt{5} 1nums.length105
  • 0 ≤ nums[i] ≤ 10 5 \texttt{0} \le \texttt{nums[i]} \le \texttt{10}^\texttt{5} 0nums[i]105

解法一

思路和算法

由于给定的数组已经排序,因此相同元素在数组中一定位于相邻的位置。对于只出现一次的元素,该元素的左边和右边各有偶数个元素。假设只出现一次的元素位于下标 index \textit{index} index,考虑下标 x x x 处的元素, x ≠ index x \ne \textit{index} x=index

  • x < index x < \textit{index} x<index 时,只出现一次的元素在下标 x x x 的右边。如果 x x x 是偶数,则 nums [ x ] = nums [ x + 1 ] \textit{nums}[x] = \textit{nums}[x + 1] nums[x]=nums[x+1];如果 x x x 是奇数,则 nums [ x ] = nums [ x − 1 ] \textit{nums}[x] = \textit{nums}[x - 1] nums[x]=nums[x1]

  • x > index x > \textit{index} x>index 时,只出现一次的元素在下标 x x x 的左边。如果 x x x 是偶数,则 nums [ x ] = nums [ x − 1 ] \textit{nums}[x] = \textit{nums}[x - 1] nums[x]=nums[x1];如果 x x x 是奇数,则 nums [ x ] = nums [ x + 1 ] \textit{nums}[x] = \textit{nums}[x + 1] nums[x]=nums[x+1]

对于下标 x x x,可以根据 x x x 的奇偶性以及与 nums [ x ] \textit{nums}[x] nums[x] 相同的元素下标判断只出现一次的元素位于下标 x x x 处、下标 x x x 的左边或下标 x x x 的右边。因此可以使用二分查找得到只出现一次的元素的下标。

low \textit{low} low high \textit{high} high 分别表示二分查找的下标范围的下界和上界,初始时 low \textit{low} low high \textit{high} high 分别为数组的最小下标和最大下标。每次查找时,取 mid \textit{mid} mid low \textit{low} low high \textit{high} high 的平均数向下取整,执行如下操作。

  • 如果 mid \textit{mid} mid 是偶数且 nums [ mid ] = nums [ mid + 1 ] \textit{nums}[\textit{mid}] = \textit{nums}[\textit{mid} + 1] nums[mid]=nums[mid+1],或 mid \textit{mid} mid 是奇数且 nums [ mid ] = nums [ mid − 1 ] \textit{nums}[\textit{mid}] = \textit{nums}[\textit{mid} - 1] nums[mid]=nums[mid1],则只出现一次的元素位于下标 mid \textit{mid} mid 的右边,因此在下标范围 [ mid + 1 , high ] [\textit{mid} + 1, \textit{high}] [mid+1,high] 中继续查找。

  • 否则,只出现一次的元素位于下标 mid \textit{mid} mid 或其左边,因此在下标范围 [ low , mid ] [\textit{low}, \textit{mid}] [low,mid] 中继续查找。

low = high \textit{low} = \textit{high} low=high 时,查找结束,此时 low \textit{low} low 即为只出现一次的元素的下标, nums [ low ] \textit{nums}[\textit{low}] nums[low] 即为只出现一次的元素。

代码

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

复杂度分析

  • 时间复杂度: O ( log ⁡ n ) O(\log n) O(logn),其中 n n n 是数组 nums \textit{nums} nums 的长度。二分查找的范围是数组的全部 n n n 个下标,二分查找的时间复杂度是 O ( log ⁡ n ) O(\log n) O(logn)

  • 空间复杂度: O ( 1 ) O(1) O(1)

解法二

思路和算法

由于只出现一次的元素的左边有偶数个元素,因此只出现一次的元素一定位于偶数下标,可以只在偶数下标中二分查找。

由于给定的数组长度是奇数,因此数组的最小下标和最大下标都是偶数,二分查找的下标范围的下界和上界的初始值分别为数组的最小下标和最大下标。每次查找时,取 mid \textit{mid} mid low \textit{low} low high \textit{high} high 的平均数向下取整,如果得到的 mid \textit{mid} mid 是奇数则将 mid \textit{mid} mid 1 1 1,确保 mid \textit{mid} mid 是偶数,执行如下操作。

  • 如果 nums [ mid ] = nums [ mid + 1 ] \textit{nums}[\textit{mid}] = \textit{nums}[\textit{mid} + 1] nums[mid]=nums[mid+1],则只出现一次的元素位于下标 mid \textit{mid} mid 的右边,因此在下标范围 [ mid + 2 , high ] [\textit{mid} + 2, \textit{high}] [mid+2,high] 中继续查找。

  • 否则,只出现一次的元素位于下标 mid \textit{mid} mid 或其左边,因此在下标范围 [ low , mid ] [\textit{low}, \textit{mid}] [low,mid] 中继续查找。

二分查找过程中,每次更新后的下标范围的下界和上界都是偶数,确保只在偶数下标中二分查找。

low = high \textit{low} = \textit{high} low=high 时,查找结束,此时 low \textit{low} low 即为只出现一次的元素的下标, nums [ low ] \textit{nums}[\textit{low}] nums[low] 即为只出现一次的元素。

代码

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

复杂度分析

  • 时间复杂度: O ( log ⁡ n ) O(\log n) O(logn),其中 n n n 是数组 nums \textit{nums} nums 的长度。二分查找的范围是数组的 n + 1 2 \dfrac{n + 1}{2} 2n+1 个偶数下标,二分查找的时间复杂度是 O ( log ⁡ n ) O(\log n) O(logn)

  • 空间复杂度: O ( 1 ) O(1) O(1)

相关文章:

二分查找题目:有序数组中的单一元素

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;有序数组中的单一元素 出处&#xff1a;540. 有序数组中的单一元素 难度 4 级 题目描述 要求 给定一个仅由整数…...

springboot基于Android的华蓥山旅游导航系统

摘 要 华蓥山旅游导航系统是一款专为华蓥山景区设计的智能导览应用&#xff0c;旨在为用户提供便捷的旅游信息服务。该系统通过整合华蓥山的地理信息、景点介绍、交通状况等数据&#xff0c;实现了对景区的全面覆盖。用户可以通过该系统获取实时的旅游资讯、交流论坛、地图等。…...

面向对象编程(OOP)深度解析:思想、原则与应用

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Java &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 面向对象编程&#xff08;OOP&#xff09;深度解析&#xff1a;思想、原则与应用 一、面向对象编程的基本…...

iPhone 17 Air看点汇总:薄至6mm 刷新苹果轻薄纪录

我们姑且将这款iPhone 17序列的超薄SKU称为“iPhone 17 Air”&#xff0c;Jeff Pu在报告中提到&#xff0c;我同意最近关于 iPhone 17超薄机型采用6 毫米厚度超薄设计的传言。 如果这一测量结果被证明是准确的&#xff0c;那么将有几个值得注意的方面。 首先&#xff0c;iPhone…...

「OpenCV交叉编译」ubuntu to arm64

Ubuntu x86_64 交叉编译OpenCV 为 arm64OpenCV4.5.5、cmake version 3.16.3交叉编译器 gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu 可在arm或linaro官网下载所需版本&#xff0c;本文的交叉编译器可点击链接跳转下载 Downloads | GNU-A Downloads – Arm Developer L…...

Stable Diffusion的解读(二)

Stable Diffusion的解读&#xff08;二&#xff09; 文章目录 Stable Diffusion的解读&#xff08;二&#xff09;摘要Abstract一、机器学习部分1. 算法梳理1.1 LDM采样算法1.2 U-Net结构组成 2. Stable Diffusion 官方 GitHub 仓库2.1 安装2.2 主函数2.3 DDIM采样器2.4 Unet 3…...

amd显卡和nVidia显卡哪个好 amd和英伟达的区别介绍

AMD和英伟达是目前市场上最主要的两大显卡品牌&#xff0c;它们各有自己的特点和优势&#xff0c;也有不同的适用场景和用户群体。那么&#xff0c;AMD显卡和英伟达显卡到底哪个好&#xff1f;它们之间有什么区别&#xff1f;我们又该如何选择呢&#xff1f;本文将从以下几个方…...

软件测试—— Selenium 常用函数(一)

前一篇文章&#xff1a;软件测试 —— 自动化基础-CSDN博客 目录 前言 一、窗口 1.屏幕截图 2.切换窗口 3.窗口设置大小 4.关闭窗口 二、等待 1.等待意义 2.强制等待 3.隐式等待 4.显式等待 总结 前言 在前一篇文章中&#xff0c;我们介绍了自动化的一些基础知识&a…...

为什么verilog中递归函数需要定义为automatic?

直接上代码 module automatic_tb;reg [7:0] value;initial begin #0 value < 8d5;#10 $display("result of automatic: %0d", factor_automatic(value));$display("result of static: %0d", factor_static(value));#50 $stop; endfunction reg[7:0] fa…...

23种设计模式-状态(State)设计模式

文章目录 一.什么是状态模式&#xff1f;二.状态模式的结构三.状态模式的应用场景四.状态模式的优缺点五.状态模式的C实现六.状态模式的JAVA实现七.代码解释八.总结 类图&#xff1a; 状态设计模式类图 一.什么是状态模式&#xff1f; 状态模式&#xff08;State Pattern&…...

EventListener与EventBus

EventListener JDK JDK1.1开始就提供EventListener&#xff0c;一个标记接口&#xff0c;源码如下&#xff1a; /*** A tagging interface that all event listener interfaces must extend.*/ public interface EventListener { }JDK提供的java.util.EventObject&#xff1…...

Facebook为什么注册失败了?该怎么解决?

有时候用户在尝试注册Facebook账号时可能会遇到各种问题&#xff0c;导致注册失败或遇到困难。小编会为大家分析Facebook注册失败的可能原因&#xff0c;并提供解决方法&#xff0c;帮助大家顺利完成注册流程。 一、Facebook注册失败的可能原因 1. 账号信息问题&#xff1a; …...

前端数据可视化思路及实现案例

目录 一、前端数据可视化思路 &#xff08;一&#xff09;明确数据与目标 &#xff08;二&#xff09;选择合适的可视化图表类型 &#xff08;三&#xff09;数据与图表的绑定及交互设计 &#xff08;四&#xff09;页面布局与样式设计 二、具体案例&#xff1a;使用 Ech…...

【DVWA】Brute Force暴力破解实战

问尔辈 何等样人 自摸心头 再来求我&#xff1b;若汝能 克存忠孝 持身正直 不拜何妨 1.Brute Force(Low) 相关的代码分析 if( isset( $_GET[ Login ] ) ) {// Get username$user $_GET[ username ];// Check the database$query "SELECT * FROM users WHERE user $…...

23种设计模式速记法

前言 在软件开发的过程中&#xff0c;设计模式作为解决常见问题的通用模板&#xff0c;一直是开发者的重要工具。尤其是在面临复杂系统架构和需求变化时&#xff0c;设计模式不仅能够提升代码的可复用性和扩展性&#xff0c;还能大大提高团队之间的协作效率。然而&#xff0c;…...

第7章硬件测试-7.3 功能测试

7.3 功能测试 7.3.1 整机规格测试7.3.2 整机试装测试7.3.3 DFX测试 功能测试包括整机规格、整机试装和整机功能测试&#xff0c;是整机结构和业务相关的测试。 7.3.1 整机规格测试 整机规格测试包括尺寸、重量、温度、功耗等数据。这些测试数据与设计规格进行比对和校验&…...

动态规划子数组系列一>等差数列划分

题目&#xff1a; 解析&#xff1a; 代码&#xff1a; public int numberOfArithmeticSlices(int[] nums) {int n nums.length;int[] dp new int[n];int ret 0;for(int i 2; i < n; i){dp[i] nums[i] - nums[i-1] nums[i-1] - nums[i-2] ? dp[i-1]1 : 0;ret dp[i…...

《Python浪漫的烟花表白特效》

一、背景介绍 烟花象征着浪漫与激情&#xff0c;将它与表白结合在一起&#xff0c;会创造出别具一格的惊喜效果。使用Python的turtle模块&#xff0c;我们可以轻松绘制出动态的烟花特效&#xff0c;再配合文字表白&#xff0c;打造一段专属的浪漫体验。 接下来&#xff0c;让…...

什么是RESTful API,有什么特点

RESTful API 概述 什么是 RESTful API&#xff1f; RESTful API 是基于 Representational State Transfer&#xff08;表现层状态转移&#xff09;架构风格的 Web 服务接口。REST 是一种设计风格&#xff0c;而不是具体的协议或标准。它定义了一组约束和最佳实践&#xff0c;…...

友思特新闻 | 友思特荣获广州科技创新创业大赛智能装备行业赛初创组优胜企业!

2024年11月19日&#xff0c;第十三届中国创新创业大赛&#xff08;广东广州赛区&#xff09;暨2024年广州科技创新创业大赛智能装备行业赛颁奖典礼隆重举行。 赛事奖项介绍&#xff1a;广州科技创新创业大赛智能装备行业赛 第十三届“中国创新创业大赛&#xff08;广东广州赛区…...

Office RibbonX Editor:让Office界面定制变得像搭积木一样简单

Office RibbonX Editor&#xff1a;让Office界面定制变得像搭积木一样简单 【免费下载链接】office-ribbonx-editor An overhauled fork of the original Custom UI Editor for Microsoft Office, built with WPF 项目地址: https://gitcode.com/gh_mirrors/of/office-ribbon…...

三十岁想从零转行现实吗?带你分辨真正有前景的好工作

![](https://img-blog.csdnimg.cn/direct/b0bfa28b59f9478dae4e6feee6659cce.png)我是29岁那年&#xff0c;完成从转行裸辞副业的职业转型。 如果你把职业生涯看成是从现在开始30岁&#xff0c;到你退休那年&#xff0c;中间这么漫长的30年&#xff0c;那么30岁转行完全来得及…...

FM3773 低功耗离线式恒流/恒压 PSR 控制器

概述 FM3773 是一种高性能的交流/直流用于电池充电器和适配器的电源控制器&#xff0c;内置 850V 功率三极管。该设备采用脉冲频率调制&#xff08;PFM&#xff09;的方法来建立非连续导通模式&#xff08;DCM&#xff09;反激式电源。 FM3773 提供精确的恒定电压&#xff0c;恒…...

基于雷达与光敏传感器的低功耗智能窗防设备设计与实现

1. 项目概述&#xff1a;一个基于雷达与光敏的智能窗防设备几年前&#xff0c;我因为一次短暂的出差&#xff0c;家里空置了几天&#xff0c;回来后就一直琢磨着怎么给家里的窗户加点“动静”。市面上的智能安防摄像头固然好&#xff0c;但要么需要复杂的布线&#xff0c;要么云…...

从安装到排错:手把手解决Linux服务器上Nacos启动失败的十大常见问题

从安装到排错&#xff1a;手把手解决Linux服务器上Nacos启动失败的十大常见问题当你在Linux服务器上部署Nacos时&#xff0c;是否遇到过启动失败却无从下手的困境&#xff1f;作为阿里巴巴开源的服务发现和配置管理平台&#xff0c;Nacos在微服务架构中扮演着重要角色。然而&am…...

3分钟掌握JetBrains IDE试用期重置:终极完整指南

3分钟掌握JetBrains IDE试用期重置&#xff1a;终极完整指南 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter JetBrains IDE试用期重置工具&#xff08;ide-eval-resetter&#xff09;是一个开源项目&#xff0c;专…...

告别Selenium?手把手教你用Playwright录制脚本,5分钟搞定Web自动化测试

5分钟极速上手Playwright脚本录制&#xff1a;零代码实现Web自动化测试当产品经理突然丢给你一个刚上线的电商活动页&#xff0c;要求半小时内完成所有核心链路测试时&#xff0c;传统的手写Selenium脚本显然来不及。作为测试工程师&#xff0c;我最近发现微软开源的Playwright…...

CI/CD流水线中的幽灵依赖——DeepSeek项目92%存在未声明的transitive risk,你中招了吗?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;CI/CD流水线中的幽灵依赖——DeepSeek项目92%存在未声明的transitive risk&#xff0c;你中招了吗&#xff1f; 在现代CI/CD实践中&#xff0c;开发者常误以为 package.json 或 requirements.txt 中显式…...

MySQL全局ID生成实战:从自增主键到自定义Sequence的平滑升级方案与避坑指南

MySQL全局ID生成实战&#xff1a;从自增主键到自定义Sequence的平滑升级方案与避坑指南 当电商平台的日订单量突破百万时&#xff0c;技术团队突然发现系统开始频繁出现"Duplicate entry"错误——那些原本可靠的自增主键&#xff0c;在分库分表的环境下变成了数据一致…...

Python运算符:成员运算符(in/not in)的使用场景

Python运算符&#xff1a;成员运算符&#xff08;in/not in&#xff09;的使用场景&#x1f4da; 本章学习目标&#xff1a;深入理解成员运算符&#xff08;in/not in&#xff09;的使用场景的核心概念与实践方法&#xff0c;掌握关键技术要点&#xff0c;了解实际应用场景与最…...