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

news/2024/12/22 10:22:23/文章来源:https://www.cnblogs.com/geek0070/p/18445443

1.题目基本信息

1.1.题目描述

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

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

你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。

1.2.题目地址

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

2.解题方法

2.1.解题思路

二分查找(红蓝染色法)

2.2.解题步骤

第一步,确定红蓝染色的特征。特征一:红:位置i处值与处于同一对的元素相等;蓝:位置i处值与处于同一对的元素不相等(如果i为奇数,相邻元素取右边的偶数,反之取左边边的奇数)。特征二:左闭右开,left-1始终指向红色,right始终指向蓝色。

第二步,标准的左闭右开二分步骤。

注意:标准的二分模板会出现索引超范围问题,为了解决超限问题,可以在尾部添加一个不能取到的值。

3.解题代码

Python代码

class Solution:# 二分查找(红蓝染色法)# 第一步,确定红蓝染色的特征。特征一:红:位置i处值与处于同一对的元素相等;蓝:位置i处值与处于同一对的元素不相等(如果i为奇数,相邻元素取右边的偶数,反之取左边边的奇数)。特征二:左闭右开,left-1始终指向红色,right始终指向蓝色。# 第二步,标准的左闭右开二分步骤。# 注意:标准的二分模板会出现索引超范围问题,为了解决超限问题,可以在尾部添加一个不能取到的值。def singleNonDuplicate(self, nums: List[int]) -> int:# 红:i与相邻的对元素相等;蓝:i与相邻元素不相等(如果i为奇数,相邻元素取右边的偶数,反之取左边的奇数)。为了解决超限问题,在尾部添加一个哑结点length=len(nums)nums.append(-1)left,right=0,lengthwhile left<right:mid=(right-left)//2+left# neighIndex=mid+1 if mid%2==0 else mid-1neighIndex=mid^1if nums[mid]==nums[neighIndex]:left=mid+1else:right=midreturn nums[left]

C++代码

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

4.执行结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

六、redis之set

Redis集合是成员的无序集合。可以用来保存唯一的成员。 注意:对于以下的命令,涉及删除成员的,如果集合中的所有元素都被移除,则集合会被删除。如果集合原先不存在,被当作空集合。 SADD SADD key member [member ...]sadd命令将一系列成员添加到set中。SMEMBERS SMEMBERS k…

IDEA创建Gradle工程-实践

1、下载Gradle 下载地址:https://gradle.org/install/#manually 进入后点击【Binary-only】下载zip包。 (国内下载可能慢,可用阿里镜像:https://mirrors.aliyun.com/macports/distfiles/gradle/)2、安装Gradle 解压zip到自定义目录:G:\OriginLib\gradle-8.9配置环境变量 …

Leetcode 2300. 咒语和药水的成功对数

1.题目基本信息 1.1.题目描述 给你两个正整数数组 spells 和 potions ,长度分别为 n 和 m ,其中 spells[i] 表示第 i 个咒语的能量强度,potions[j] 表示第 j 瓶药水的能量强度。 同时给你一个整数 success 。一个咒语和药水的能量强度 相乘 如果 大于等于 success ,那么它们…

java 反序列化 cc1 复现

cc1java反序列化cc1漏洞复现,环境commoncollections3.2.1, java8u65. 分析的时候从执行命令的部分开始,一点一点的倒退回反序列化接口.目的:在java反序列化的时候会利用构造函数来进行对象的构造,那么我们的目标就是只调用构造函数来执行命令. 源码剖析 Transformer 一个接口,定…

吴恩达机器学习课程 笔记5 神经网络

神经网络原理 神经网络是一种受生物神经系统启发的计算模型,用于学习和处理复杂的数据模式。神经网络通过一系列相互连接的简单处理单元(称为神经元或节点)来模拟大脑的功能。下面详细介绍神经网络的基本原理。 神经网络的基本构成神经元(Neuron):神经元是神经网络的基本…

在树莓派上部署yolo模型推理并使用onnx加速

首先在这里感谢一下这位大佬:学不会电磁场的个人空间-学不会电磁场个人主页-哔哩哔哩视频 (bilibili.com) 这里使用的代码是从手把手教你使用c++部署yolov5模型,opencv推理onnx模型_哔哩哔哩_bilibili处来的我这里只记录下更换成自己的模型的应用以及提供一份全注释的版本树莓…

Redis 发布订阅模式

概述 Redis 的发布/订阅是一种消息通信模式:发送者(Pub)向频道(Channel)发送消息,订阅者(Sub)接收频道上的消息。Redis 客户端可以订阅任意数量的频道,发送者也可以向任意频道发送数据。在发送者向频道发送一条消息后,这条消息就会被发送到订阅该频道的客户端(Sub)…

01-什么是逻辑?

感觉 知觉 感性认识 理性认识 感觉 知觉 表象 形象思维 ==》概念 在感性认识的基础上,人们通过抽象与概括,舍弃个别事物表面的、次要的属性,而把握住一类事物特有的、共同的、本质的属性,于是就形成了反映事物的概念。 直观性与个别性是感觉、知觉与表象的特点;抽…

十五款好看的键帽,总有一款适合你✔

在客制化键盘的时候,发现了不少挺好看的键帽,特地来分享一波。在客制化键盘的时候,发现了不少挺好看的键帽,特地来分享一波。 不含广告哈,只会列出一些搜索关键词,可以在各大电商搜索查到。 如果你已经有了键盘,也可以看看是否支持拆卸键帽,偶尔换换键帽调整心情。 PS:…

10-入侵检测技术原理与应用

10.1 入侵检测概述 1)概念 20世纪 80年代初期,安全专家认为: “入侵是指未经授权蓄意尝试访问信息、篡改信息,使系统不可用的行为。” 美国大学安全专家将入侵定义为 “非法进入信息系统,包括违反信息系统的安全策略或法律保护条例的动作”。 我们认为,入侵应与受害目标相…

Nexpose 6.6.271 发布下载,新增功能概览

Nexpose 6.6.271 发布下载,新增功能概览Nexpose 6.6.271 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, release Sep 26, 2024 请访问原文链接:https://sysin.org/blog/nexpose-6/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org您的…

在树莓派上安装c++版本的opencv并运行

这里默认你用的是树莓派的镜像(因为ubantu对树莓派的性能占用有点大) 树莓派安装使用 opencv c++版本 首先我们安装依赖sudo apt-get install build-essentialsudo apt-get install cmake libgtk2.0-dev pkg-config libswscale-devsudo apt-get install libjpeg-dev libpng-d…