LeetCode双指针:有序数组中的单一元素
LeetCode双指针:有序数组中的单一元素
题目描述
给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。
请你找出并返回只出现一次的那个数。
你设计的解决方案必须满足 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) 空间复杂度得知需使用二分查找,怎么找?考虑到它的总数一定是为奇数,那么就可以从左右两边每次划分后的数量进行查找,怎么判别获得中间值之后知道哪一边是几十个哪一边是偶数个?这个我用的笨方法:举例
-
1、
[1,1,2,3,3,4,4]右指针为6,左指针为0,除以2之后mid为3(奇数)落在第一个3上,根据预想需要调整右指针到第二个3上 -
2、
[1,1,2,2,3,3,4]右指针为6,左指针为0,除以2之后mid为3(奇数)落在第二个2上,根据预想需要调整左指针到第一个2上 -
3、
[1,2,2,3,3]右指针为4,左指针为0,除以2之后mid为2(偶数)落在第二个2上,根据预想需要调整右指针到第二个2上 -
4、
[1,1,2,2,3]右指针为4,左指针为0,除以2之后mid为2(偶数)落在第一个2上,根据预想需要调整左指针到第一个2上
可能此种解释比较麻烦,我也没找到让自己和解的方法,仅代表我自己的理解
接下来就是进行归类,我把需要移动左指针的进行归类(1,3)先进行假设:
-
- 若mid为奇数判断它和它前一个是否相等,相等则左指针调整
-
- 若mid为偶数判断它和它后一个是否相等,相等则左指针调整
带入2,4情况,发现符合,可以试试找规律,自己推出来较为容易理解,上述也可以不知道这一种选择,改变判等的位置,相应更改后边即可
代码
public class BinSearch3 {public int singleNonDuplicate(int[] nums) {int low = 0, high = nums.length - 1;while (low < high) {int mid = (high - low) / 2 + low;//若mid为偶数判断它和它后一个是否相等,相等则左指针调整if (mid%2==0){if (nums[mid] == nums[mid + 1]){low = mid + 1;}else {high = mid;}//若mid为奇数判断它和它前一个是否相等,相等则左指针调整}else {if (nums[mid] == nums[mid - 1]){low = mid + 1;}else {high = mid;}}}return nums[low];}public static void main(String[] args) {BinSearch3 b=new BinSearch3();System.out.println(b.singleNonDuplicate(new int[]{1,1,2,3,3,4,4}));}
}
代码优化
如上,判定奇偶情况代码十分臃肿,冗余,对其进行进一步改进,此时需要了解^的使用
位运算的异或操作符 ^。二进制中,异或有一个有趣的性质,即 a ^ b 在 a 和 b 不相同时结果为 1,相同时结果为 0。
1 ^ 3 的结果是 01 ^ 11 = 10,即十进制中的 2。
带入上述例子[1,1,2,2,3,3,4]mid=3,为奇数将2和1进行异或 01 ^ 11 = 10即十进制中的 2那么不正是相当于对其进行了减一操作
同理,当mid=2时,01 ^ 10 = 11即十进制中的 3那么不正是相当于对其进行了加一操作
因此对其进行优化后:
public class BinSearch3 {public int singleNonDuplicate(int[] nums) {int low = 0, high = nums.length - 1;while (low < high) {int mid = (high - low) / 2 + low;if (nums[mid] == nums[mid ^ 1]) {low = mid + 1;} else {high = mid;}}return nums[low];}public static void main(String[] args) {BinSearch3 b = new BinSearch3();System.out.println(b.singleNonDuplicate(new int[]{1, 1, 2, 3, 3, 4, 4, 8, 8}));}
}
相关文章:
LeetCode双指针:有序数组中的单一元素
LeetCode双指针:有序数组中的单一元素 题目描述 给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。 请你找出并返回只出现一次的那个数。 你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复…...
熬夜会秃头——Beta冲刺总结随笔
这个作业属于哪个课程2301-计算机学院-软件工程社区-CSDN社区云这个作业要求在哪里团队作业—beta冲刺事后诸葛亮-CSDN社区这个作业的目标总结Beta冲刺团队名称熬夜会秃头团队置顶集合随笔链接熬夜会秃头——Beta冲刺置顶随笔-CSDN社区 目录 一、Beta冲刺开始前设立的任务完成…...
C++函数模板案例
利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序排序规则从大到小,排序算法为选择排序分别利用char数组和int数组进行测试 #include<iostream> using namespace std;template<class T> void myswap(T& a, T& b) {T…...
同旺科技 USB TO RS-485 定制款适配器--- 拆解(三)
内附链接 1、USB TO RS-485 定制款适配器 ● 支持USB 2.0/3.0接口,并兼容USB 1.1接口; ● 支持USB总线供电; ● 支持Windows系统驱动,包含WIN10 / WIN11系统32 / 64位; ● 支持Windows RT、Linux、Mac OS X、Windo…...
Vue学习计划-Vue2--Vue核心(六)过滤器和自定义指令
1. 过滤器 定义:对要显示的数据进行特定格式转换再显示(适用于一些简单逻辑的处理)语法: 注册过滤器:Vue.filter(name, callback) 或 new Vue{filters:{}}使用过滤器:{{ xx | 过滤器名 }} 或 v-bind:属性 …...
Codeforces Round 913 (Div. 3) (A-G)
后天就是 I C P C ICPC ICPC杭州站了,今天把之前做的 d i v 3 div3 div3题补一下,打完这场杭州站这赛季除了 E C F i n a l EC\,\,Final ECFinal就结束了,以后应该要多打 c f cf cf比赛练习保持手感,争取下赛季冲一下金牌。 感觉这…...
CSS——sticky定位
1. 大白话解释sticky定位 粘性定位通俗来说,它就是相对定位relative和固定定位fixed的结合体,它的触发过程分为三个阶段 在最近可滚动容器没有触发滑动之前,sticky盒子的表现为相对定位relative【第一阶段】, 但当最近可滚动容…...
Redis hash表源码解析
1、 整体数据结构 链式hash解决hash冲突、采用渐进式hash来完成扩容过程。 /** 哈希表节点*/ typedef struct dictEntry {// 键void *key;// 值union {void *val;uint64_t u64;int64_t s64;} v;// 指向下个哈希表节点,形成链表struct dictEntry *next;} dictEntry;…...
dll动态链接库【C#】
1说明: 在C#中,dll是添加 【类库】生成的。 2添加C#的dll: (1)在VS中新建一个Windows应用程序项目,并命名为TransferDll。 (2)打开Windows窗体设计器,从工具箱中为窗体…...
Linux 系统设置cpu频率
source_code: https://github.com/emagii/cpufrequtils cpufreq-set - A small tool which allows to modify cpufreq settings.(修改内存频率的工具) cpufreq-set allows you to modify cpufreq settings without having to type e.g. “/sys/devices…...
git基本概念
一、版本控制概念 1.1 什么是版本控制 1.1.1 手动管理文件版本 1.1.2 版本控制软件 概念:版本控制软件是一个用来记录文件发生的变化,以便将来查阅特定版本修订情况的系统,有时也叫“版本控制系统”。通俗的理解就是把手工管理文件版本的方…...
多个HTML属性
在HTML中,属性用于提供有关HTML元素的附加信息。在这篇文章中你将学习多个HTML属性,它们可以增强网站的视觉吸引力。 接下来开始吧!🚀 Accept 属性 您可以将accept属性与<input>元素(仅用于文件类型ÿ…...
基于运算放大器的电压采集电路
一、运算放大器 运放推导的两个重要概念:虚短、虚断。 1、差分放大器 以差分放大器为例进行推导分析。 虚断–运放的"-“端、”“端的引脚电流接近为0; 根据基尔霍夫电流定律可知:iR1iRF,iR2iR3; iR1(Ui1-(V-…...
数字图像处理(实践篇) 十六 基于分水岭算法的图像分割
目录 一 分水岭算法 二 利用OpenCV实现分水岭算法的过程 三 实践 一 分水岭算法 基于任何灰度图像都可以视为地形表面,其中高强度表示山峰和山丘,而低强度表示山谷。首先,开始用不同颜色的水(标签)填充每个孤立的山…...
快速学习PyQt5的高级自定义控件
Pyqt5相关文章: 快速掌握Pyqt5的三种主窗口 快速掌握Pyqt5的2种弹簧 快速掌握Pyqt5的5种布局 快速弄懂Pyqt5的5种项目视图(Item View) 快速弄懂Pyqt5的4种项目部件(Item Widget) 快速掌握Pyqt5的6种按钮 快速掌握Pyqt5的10种容器&…...
Python中读写(解析)JSON文件的深入探究
目录 一、引言 二、如何读取JSON文件 三、如何写入JSON文件 四、如何解析JSON字符串 五、错误处理和异常处理 六、使用第三方库提高效率 七、总结 一、引言 在Python中,我们经常使用JSON(JavaScript Object Notation)格式来存储和传输…...
我获取股票和期货数据的常用函数
记录一下获取数据所使用的函数,以防止遗忘和方便查找。 # 获取掘金的数据 # 需要打开并登陆掘金终端 def get_data_juejin(symbol"bu2112",start"2021-8-1",end"2021-8-30 23:00:00",frequency"1800s",fields"eob,sy…...
高并发场景下的httpClient使用优化技巧
1. 背景 我们有个业务,会调用其他部门提供的一个基于http的服务,日调用量在千万级别。使用了httpclient来完成业务。之前因为qps上不去,就看了一下业务代码,并做了一些优化,记录在这里。 先对比前后:优化…...
用php上传图片到阿里云oss
如果你想自动创建目录并将文件上传到新的目录下,你可以使用阿里云 OSS 的 createObject 方法来实现。下面是更新后的示例代码: php <?php require_once __DIR__ . /vendor/autoload.php; // 引入 SDKuse OSS\OssClient; use OSS\Core\OssException;…...
服务器适合哪些使用场景_Maizyun
服务器适合哪些使用场景 在当今的数字化时代,服务器作为互联网基础设施的核心组件,被广泛应用于各种场景。本文将探讨服务器适合哪些使用场景。 一、Web服务器 Web服务器是服务器中最常见的一种,用于托管和运行网站。它负责处理来自客户端…...
如何快速实现Obsidian插件本地化:obsidian-i18n完整实践指南
如何快速实现Obsidian插件本地化:obsidian-i18n完整实践指南 【免费下载链接】obsidian-i18n 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-i18n 你是否曾因Obsidian插件全是英文界面而苦恼?作为中文用户,面对"Backli…...
如何在Ozon产品测款?用CaptainAI精准锁定爆款潜力款
做Ozon运营,测款是店铺长期盈利的关键——选对款能事半功倍,测错款则会积压库存、浪费成本,中小卖家资金精力有限,盲目铺货测款易陷入“高投入、低回报”困境。很多卖家测款常踩坑:凭感觉跟风选热门款,竞争…...
RSA1 - Writeup by AI
RSA1 - Writeup by AI 1. 题目描述项目内容题目来源Bugku题目类型Crypto (密码学)考点RSA 大数分解、私钥计算题目信息 题目给出了 RSA 加密的三个参数: e 65537 N 1018261336751023520497560395829454421245429586704872293236600679847605951423419167478189648…...
告别手动复制粘贴:MeterSphere参数提取功能详解,让你的接口自动化测试效率翻倍
MeterSphere参数提取实战:构建动态接口测试链的三大高阶技巧 在持续集成环境中,接口自动化测试往往面临一个关键挑战:如何让不同接口之间实现数据动态传递?传统的手动复制粘贴不仅效率低下,更难以应对复杂业务场景。Me…...
MAX7319 GPIO输入扩展库:硬件边沿检测与中断驱动实践
1. 项目概述iotec_MAX7319 是一款面向嵌入式系统的轻量级 C 驱动库,专为 Maxim Integrated(现属 Analog Devices)推出的 IC 接口 GPIO 扩展芯片 MAX7319 设计。该芯片并非通用型端口扩展器,而是一款带可屏蔽边沿检测功能的专用输入…...
Phi-4-reasoning-vision-15B高算力适配:双GPU显存占用监控与低并发稳定性验证
Phi-4-reasoning-vision-15B高算力适配:双GPU显存占用监控与低并发稳定性验证 1. 模型概述与技术背景 Phi-4-reasoning-vision-15B是微软推出的视觉多模态推理模型,专为复杂视觉理解任务设计。作为2026年发布的重要模型,它在图像理解、文档…...
避开这些坑!用MATLAB做QPSK调制解调仿真时,你的成形滤波和匹配滤波设置对了吗?
QPSK仿真中的成形滤波与匹配滤波陷阱:MATLAB实战避坑指南 在数字通信系统的设计与验证过程中,MATLAB仿真扮演着至关重要的角色。许多工程师和研究人员在QPSK调制解调仿真中,常常遇到性能不达预期或结果与理论不符的情况。本文将深入剖析成形滤…...
重庆银行:万亿新贵的高光与隐忧
对于重庆银行而言,2026年3月24日是一个值得载入史册的日子。就在这一天,该行正式发布了2025年年度报告,其资产规模突破以往周期,使其成功跻身“万亿级城商行俱乐部”。其中,该行的营收与净利润时隔五年再次实现了“双十…...
拉丝机在紧固件生产中的作用与工艺流程_6月FES上海紧固件展
2026第十六届上海紧固件专业展将于6月24日至26日在国家会展中心(上海)举行。本届展会由上海上搜展览与华人螺丝网联合打造,并获得行业权威机构支持,整体展出规模约70,000平方米,预计汇聚1,400余家参展企业和25,000名专…...
从一次数据精度丢失的坑说起:详解Pandas fillna的‘静默下转型’与infer_objects的正确用法
从数据精度陷阱到稳健处理:Pandas类型转换的深度防御实践 1. 当.fillna(0)成为数据分析的隐形杀手 凌晨三点的办公室,咖啡杯早已见底。数据分析师李明盯着屏幕上诡异的报表结果——所有百分比计算结果突然变成了整齐的整数。这个看似简单的数据清洗操作…...
