java数据结构与算法刷题-----LeetCode540. 有序数组中的单一元素

STM32F407 HAL库定时器触发ADC采集与DMA数据传输(定时器TIM+ADC+DMA) 在STM32F407系列微控制器的开发中,结合定时器、ADC(模数转换器)与DMA(直接存储器访问)控制器,能够显著提升数据采集与传输的效率。本文将指导你如何使用STM32 HAL库,通过定时器触发ADC1的单通道采集,利用DMA传输数据,最终通过串口将电压值打印出来。具体实现中,我们将读取ADC1的通道5(对应引脚PA5),并将转换得到的电压值发送到串口助手上进行显示。 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

在这里插入图片描述

1. 异或运算

解题思路:时间复杂度O( n n n),空间复杂度O( 1 1 1)
  1. 利用异或操作,因为异或满足结合律和交换律
  2. 两个二进制位,相同的数异或结果为0,两个不同的数异或结果为1
  3. 而对与10进制,两个相同的数异或必然为0,因为两个10进制数,每位二进制数都相同,也就是a ^ a = 0
  4. 因此将数组中所有的数全部进行异或运算,出现两次的数都会为0
  5. 而任何数a ^ 0都等于a本身
  6. 因此例如aabcc这样的序列,想要找到中间那个出现次数一次的b,只需要异或即可

1、a^a = 0, 2、0^b = b, 3、b^c = b^c, 4、b ^c ^c = b^0 = b

代码

在这里插入图片描述

class Solution {
    public int singleNonDuplicate(int[] nums) {
        int a = nums[0];//异或操作,两个相同的数异或会归0,并且满足交换律
        for(int i = 1 ; i < nums.length; i++) a^=nums[i];
        return a;//最终所有出现两次的数会全部抵消,只剩下一个出现一次的数a
    }
}

2. 全数组二分查找+异或奇偶

解题思路:时间复杂度O( l o g 2 n log_2n log2​n),空间复杂度O( 1 1 1)
  1. 利用整个数组的数字分配规律,来进行二分查找
  2. 因为整个数组只有一个元素x的个数是奇数—1个,其余都是偶数有2个。所有以x为中心,两边都是偶数个元素。而x左边的元素会保证偶数分配规律(每个数字第一次出现都是偶数下标),而x只有一个,破坏了规律,x右边的变成符合奇数规律
  3. 因此可以利用这个偶数规律,x左边的元素,从偶数0开始,依次判断是否nums[y] = nums[y+1]即可,其中y是偶数
  4. 而x右边的元素,会被x破坏偶数关系,将会从奇数开始两个两个分布,因此x右边判断是否满足nums[z] = nums[z+1]即可,其中z是奇数
  5. 有了上面的原理后,我们就可以利用这个信息,x左边的数字分配规律为,如果是偶数下标一定是第一个,如果是奇数下标一定是这个数字的第二个。
  6. 也就是说如果mid为偶数,比较nums[mid]和nums[mid+1]. 如果是奇数比较nums[mid-1]和nums[mid]
  7. 如果比较结果为相等,说明满足偶数规律,也就是mid < x.mid还在x的左边,因此调整左边界

使用的异或奇偶性质参考:

位运算https://blog.youkuaiyun.com/grd_java/article/details/136119268
  1. 如果mid是偶数,mid +1 操作相当于 mid ^ 1

例如2是偶数,二进制为0010,异或1(二进制0001)结果为0011.

  1. 如果mid是奇数,mid - 1 操作相当于 mid ^ 1

例如1是奇数,二进制为0001,异或1(二进制0001)结果为0000.

代码

在这里插入图片描述

class Solution {
    public int singleNonDuplicate(int[] nums) {
        int low = 0, high = nums.length - 1;//二分查找
        while (low < high) {
            int mid = (high - low) / 2 + low;//获取mid
            //因为整个数组只有一个元素x的个数是奇数1个,其余都是偶数有2个。所有以x为中心,两边都是偶数个元素
            //因此可以利用这个偶数规律,x左边的元素,从偶数0开始,依次判断是否nums[y] = nums[y+1]即可
            //而x右边的元素,会被x破坏偶数关系,将会从奇数开始两个两个分布,因此x右边判断是否满足nums[z] = nums[z+1]即可
            //有了上面的原理后,我们就可以利用这个信息,x左边的数字分配规律为,如果是偶数下标一定是第一个,如果是奇数下标一定是这个数字的第二个。
            //也就是说如果mid为偶数,比较nums[mid]和nums[mid+1]. 如果是奇数比较nums[mid-1]和nums[mid]
            //如果比较结果为相等,说明满足偶数规律,也就是mid < x.mid还在x的左边,因此调整左边界
            if (nums[mid] == nums[mid ^ 1]) {//如果是偶数mid和mid+1比,奇数mid和mid-1比
                low = mid + 1;
            } else {//如果不相等,说明不满足偶数规律,也就是mid >= x,调整右边界
                high = mid;
            }
        }
        return nums[low];//最后low将指向x位置
    }
}

3. 偶数下标二分查找

解题思路:时间复杂度O( l o g 2 n log_2n log2​n),空间复杂度O( 1 1 1)
  1. 法二是整个数组去找。并没有完全利用偶数性质
  2. x虽然是打破偶数规则的数,但是其本身依然符合偶数规则(第一次出现是在偶数下标位置)
  3. 而x后面的元素全部因为x的影响,无法满足偶数规则
  4. 而且x也是第一个不满足nums[x] == nums[x+1]的数(x是偶数)。
  5. 因此这个问题变成了,找到第一个nums[x] != nums[x+1]的数(x是偶数)

简单来说,x是第一个满足nums[x] != numsx+1的数,那么x就是那个只出现1次的数。

其余逻辑和法二一样

如何保证所有数都是偶数?

  1. 如果当前数是奇数的话,让其-1。
  2. 如果当前数是偶数的话,让其-0.
  3. 通过与操作完成即可。也就是mid -= mid&1.

假设mid是偶数2,二进制为0010,2&1 = 0010 & 0001 = 0000.也就是mid&1 = 0.mid - 0 = mid。
假设mid是奇数3,二进制为0011,3&1 = 0011&0001 = 0001,也就是mid&1 = 1.mid -=mid&1 ==> mid -1

代码

在这里插入图片描述

class Solution {
    public int singleNonDuplicate(int[] nums) {
        int low = 0, high = nums.length - 1;
        while (low < high) {
            int mid = (high - low) / 2 + low;//二分查找
            mid -= mid & 1;//保证当前mid是偶数下标
            if (nums[mid] == nums[mid + 1]) {//如果满足nums[mid] == nums[mid + 1],说明现在mid<x
                low = mid + 2;//去mid右边找
            } else {//如果不满足,则mid>=x, 但是不能保证就是x,所以需要继续左边找
                high = mid;//去mid左边,直到找到x为止
            }
        }
        return nums[low];
    }
}

FLUENT Meshing Watertight Geometry工作流入门 - 5 生成表面网格 我们学习在生成表面网格任务下的不同输入。讨论了局部尺寸控制与全局尺寸控制的影响。最后,讨论了如何改进表面网格,以实现好的体网格质量。 阅读详情

相关推荐

lstm如何输入多维序列_深度学习也可以做时间序列异常诊断

最近在看的一篇论文里,用到了GRU、VAE等技术来做多维时间序列异常诊断。那么今天首先来聊一聊深度学习的基础知识,然后简单说一下论文。以下基础知识部分的内容,主要来源于李宏毅老师的课程。有兴趣的可以去看李老师的课程哦https://www.bilibili.com/video/BV1JE411g7XF?p=1 1、GRU(Gate Recurrent Unit):GRU是循环神经网络(Recurr...

weixin_30899789的博客 2836

leetcode:(540) Single Element in a Sorted Array(java)

题目:       Given a sorted array consisting of only integers where every element appears twice except for one element which appears once. Find this single element that appears only once. Example 1: ...

Sunshine_liang1的博客 495

PostgreSQL高可用之主备复制

多个PostgreSQL可协同工作,如果主库发生宕机备库将迅速进行接管并对外提供服务以实现高可用。本文将从主备复制、主备切换、故障转移等角度进行实际测试演练。第一章主备复制是基础,通过主备复制可以得到一个或多个相同的实例。在主备复制的基础上通过第二章主备切换介绍了如何手工将主库与备库互换角色。在第三章中,采用了Keepalived进行实时监测,在主库宕机后,使用主备切换中提到的命令使备库升级为主库并对外提供服务,以达到PostgreSQL高可用的目标。

asdasdsaff的博客 1349

LeetCode详细题解-Java版

LeetCode 1- 100 **1. 两数之和 : ** https://blog.csdn.net/love905661433/article/details/84779586 **2. 两数相加 : **https://blog.csdn.net/love905661433/article/details/84842140 **3. 无重复字符的最长子串 : **https://blog....

听雪楼 5万+

通达信波段交易公式实战:如何用副图指标精准捕捉买卖点(附完整源码)

本文深入解析通达信波段交易副图指标的构建与应用,提供完整源码实现,帮助投资者精准捕捉买卖点。通过趋势强度度量、超买超卖判断及信号过滤机制,结合K线图分析,有效提升波段交易的成功率。

weixin_29306317的博客 611

Qwen3-VL、Qwen3-Next与Qwen3.5多模态架构深度解剖

多模态大模型的核心不在参数规模,而在于视觉与文本如何协同建模。本文从基础概念切入,解析视觉语言模型中视觉编码器、跨模态注意力、特征对齐与token压缩等关键原理;阐述ViT、CLIP-ViT及动态压缩模块(HDTC)在语义表征、空间感知与计算效率上的技术权衡;强调结构设计如何决定模型在医学影像、工业质检、遥感分析等高要求场景中的真实能力边界;最终聚焦通义千问最新三套VL架构——Qwen3-VL、Qwen3-Next与Qwen3.5——揭示其背后迥异的融合哲学与工程取舍,为选型、微调与推理优化提供底层依据。

weixin_33778544的博客 818

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

题目描述 给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。 请你找出并返回只出现一次的那个数。 你设计的解决方案必须满足 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 思路 二分思想 + 小技巧(脑筋急转弯) 代码 ...

Sherlock的博客 975

告别Failed to start错误!保姆级教程:用Ubuntu20.04安装盘搞定GRUB与系统服务修复

本文提供Ubuntu20.04系统启动失败的专业修复指南,详细讲解如何利用安装盘解决GRUB与系统服务问题,避免重装系统导致的数据丢失。涵盖分区挂载、chroot环境操作、服务诊断与修复等实用技巧,帮助用户高效恢复系统正常运行。

weixin_32578161的博客 331

Leetcode540. 二分查找找出数组中只出现一次的元素

二分查找

obrcnh的博客 1442

一文搞懂雷达脉冲压缩和匹配滤波器

为了解决传统单频脉冲雷达面临的作用距离和空间分辨力之间的矛盾,脉冲压缩理论被提出。在接收端设计一个和发射信号能够“共轭匹配”的网络来实现脉冲压缩。接收到的回波信号通过匹配滤波器时,滤波器的增益在信号越强的频率点越大;在信号越弱的频率点,增益越小,通过这样的方式使信号在时域更加集中。脉冲压缩技术大致可分为线性调频(LFM)和相位编码。其中LFM信号易于通过硬件或各种技术产生,但是进行匹配滤波后主旁瓣比高达13.2dB,在检测多个目标时,强目标的回波旁瓣可能会把弱小信号覆盖,导致弱小信号的检测受到影响。

FPGA入门到跑路 9941

Prompt Learning 简介

• Prompt Learning 可以将所有的任务归一化预训练语言模型的任务• 避免了预训练和fine-tuning 之间的gap,几乎所有 NLP 任务都可以直接使用,不需要训练数据。• 在少样本的数据集上,能取得超过fine-tuning的效果。• 使得所有的任务在方法上变得一致。

jxsdq的博客 1万+

[C++]Leetcode超高效刷题顺序及题目详解笔记(持续更新中)

一.引言 博主最近在LeetCode上用C++练习。一路走来踩过一些坑,做了一些总结和笔记,分享给需要的人。 LeetCode网址:https://leetcode.com/ LeetCode中文版:https://leetcode-cn.com/ 二.刷题指南 LeetCode 是一个非常棒的平台,收集了许多公司的面试题目。相对其他平台而言,有着下面的几个优点: 题目全部来自业内大公司的真实面试不用处理输入输出 精力全放在解决具体问题上题目有丰富的讨论 可以参考别人的思路精确了解自己代码在所有提交代码中

cpb____的博客 2万+

Open3D 点云数学形态学滤波(Python版本)

Open3D 点云数学形态学滤波(Python版本)

dayuhaitang1的博客 1397

力扣热题——有序数组中的单一元素(难度:中等)

中等难度,超详细解释,两种解法,两种写法,新手也能学会!!!

WenJGo的博客 865

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【LeetCode:540. 有序数组中的单一元素 + 二分】

【LeetCode:540. 有序数组中的单一元素 + 二分】给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。 请你找出并返回只出现一次的那个数。 你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。

Coder_ljw的博客 656

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

​LeetCode刷题实战540:有序数组中的单一元素

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !...

程序IT圈 240

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

leetcode刷题记录

刷题过程记录

洪肥肥的博客 2063

Java实现 LeetCode 540 有序数组中的单一元素(位运算入门)

540. 有序数组中的单一元素 给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。 示...

5384

怎么修改数组中指定元素_LeetCode 力扣官方题解|540.有序数组中的单一元素

力扣 540. 有序数组中的单一元素「链接」(点击文末阅读原文查看题目题目描述给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。示例 1:输入: [1,1,2,3,3,4,4,8,8]输出: 2示例 2:输入: [3,3,7,7,10,11,11]输出: 10注意: 您的方案应该在 O(log n) 时间复杂度和 O(1) 空间复杂度中运行。解决方案方法一:暴...

weixin_40001805的博客 155

中求解数组中元素个数_LeetCode 力扣官方题解|540.有序数组中的单一元素

力扣 540. 有序数组中的单一元素「链接」(点击文末阅读原文查看题目题目描述给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。示例 1:输入: [1,1,2,3,3,4,4,8,8]输出: 2示例 2:输入: [3,3,7,7,10,11,11]输出: 10注意: 您的方案应该在 O(log n) 时间复杂度和 O(1) 空间复杂度中运行。解决方案方法一:暴...

weixin_30983209的博客 132

LeetCode题练习与总结:有序数组中的单一元素--540

本文详细介绍了如何使用二分查找算法在有序数组中找到只出现一次的元素,分析了算法的时间复杂度和空间复杂度,并总结了涉及的关键知识点,为解决此类问题提供了清晰的思路和代码实现。

一直学习永不止步 832

中求解数组中元素个数_LeetCode 力扣官方题解 | 540. 有序数组中的单一元素

力扣 540. 有序数组中的单一元素(点击查看题目)力扣​leetcode-cn.com题目描述给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。示例 1:输入: [1,1,2,3,3,4,4,8,8] 输出: 2示例 2:输入: [3,3,7,7,10,11,11] 输出: 10注意: 您的方案应该在 O(log n) 时间复杂度和 O(1) 空间复杂度中运...

weixin_35562751的博客 188

【LeetCode每日一题】——540.有序数组中的单一元素

给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。 请你找出并返回只出现一次的那个数。 你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。...

IronmanJay 587

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

给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。 示例 1: 输入: [1,1,2,3,3,4,4,8,8] 输出: 2 示例 2: 输入: [3,3,7,7,10,11,11] 输出: 10 注意: 您的方案应该在 O(log n)时间复杂度和 O(1)空间复杂度中运行。 【思路】 这道题给我们了一个有序数组,说是所有的元素都出现了两...

zpznba的博客 457

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

给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。 请你找出并返回只出现一次的那个数。 你设计的解决方案必须满足 $O(log n)$ 时间复杂度和 $O(1)$ 空间复杂度。

weixin_43412762的博客 638

LeetCode:540. 有序数组中的单一元素(二分 Java)

利用二分,如果mid是奇数,那么与mid - 1比较,如果mid为偶数,与mid+1比较。

Cosmoshhhyyy的博客 649
上一篇: java数据结构与算法刷题-----LeetCode744. 寻找比目标字母大的最小字母
下一篇: java数据结构与算法刷题-----LeetCode278. 第一个错误的版本
ydenergy_殷志鹏
博客等级 码龄7年 5887粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值