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

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

    • 1. 异或运算
    • 2. 全数组二分查找+异或奇偶
    • 3. 偶数下标二分查找

在这里插入图片描述

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 log2n),空间复杂度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.csdn.net/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 log2n),空间复杂度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<xlow = mid + 2;//去mid右边找} else {//如果不满足,则mid>=x, 但是不能保证就是x,所以需要继续左边找high = mid;//去mid左边,直到找到x为止}}return nums[low];}
}

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

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

相关文章

前端如何判断元素是否到达可视区域

以图片显示为例&#xff1a; window.innerHeight 是浏览器可视区的高度&#xff1b;document.body.scrollTop || document.documentElement.scrollTop 是浏览器滚动的过的距离&#xff1b;imgs.offsetTop 是元素顶部距离文档顶部的高度&#xff08;包括滚动条的距离&#xff0…

快速上手Spring Cloud 十一:微服务架构下的安全与权限管理

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

机器学习——聚类算法-层次聚类算法

机器学习——聚类算法-层次聚类算法 在机器学习中&#xff0c;聚类是一种将数据集划分为具有相似特征的组或簇的无监督学习方法。聚类算法有许多种&#xff0c;其中一种常用的算法是层次聚类算法。本文将介绍聚类问题、层次聚类算法的原理、算法流程以及用Python实现层次聚类算…

蓝桥杯练习题——博弈论

1.必胜态后继至少存在一个必败态 2.必败态后继均为必胜态 Nim游戏 思路 2 3&#xff0c;先手必赢&#xff0c;先拿 1&#xff0c;然后变成 2 2&#xff0c;不管后手怎么拿&#xff0c;先手同样操作&#xff0c;后手一定先遇到 0 0 a1 ^ a2 ^ a3 … ^ an 0&#xff0c;先…

【文献分享】myMUSCLE, a New Multiphysics, Multiscale Simulation Coupling Environment

题目&#xff1a;myMUSCLE, a New Multiphysics, Multiscale Simulation Coupling Environment 链接&#xff1a; https://doi.org/10.1080/00295639.2022.2148809 myMUSCLE&#xff0c;一种新的多物理场、多尺度仿真耦合环境 摘要 计算能力的提高使核界能够结合有关反应…

【保姆级讲解如何Chrome安装Vue-devtools的操作】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

github配置ssh

生成公钥 在电脑用户的目录下打开终端执行 ssh-keygen -t rsa: 执行完不要关 配置文件 看看用户的目录里 .ssh 目录&#xff1a; Host github.comHostname ssh.github.comPort 443配置公钥 复制 id_rsa.pub 文件里的内容 粘贴到 github上 连接密钥 回到刚才的终端…

sql语句的常用方法以及sql语句的通用方法

SQL语句常用方法及步骤 一、sql七步曲1.七步曲2.DVD数据库中的表的设计详情&#xff1a; 二、增三、删四、改五、查六、方法优化1--非查找七、方法优化2--查找总结 一、sql七步曲 1.七步曲 1.手动加载数据库驱动类 2.获得数据库连接对象 3.写sql语句 4.获得执行对象 5.执行命…

Leaflet 中创建一个二维地图

要在 Leaflet 中创建一个二维地图&#xff0c;需要以下步骤&#xff1a; 1. 引入 Leaflet 库 首先&#xff0c;你需要在 HTML 文件中引入 Leaflet 库的 CSS 和 JavaScript 文件。你可以从官方网站下载 Leaflet&#xff0c;或者通过 CDN 引入。 <!-- Leaflet CSS --> &…

【QQ版】QQ群短剧机器人源码 全网短剧机器人插件

内容目录 一、详细介绍二、效果展示2.效果图展示 三、学习资料下载 一、详细介绍 QQ版本可以兼容两个框架&#xff08;HTQQ&#xff0c;MYQQ这两个的vip版也可以使用) 支持私聊与群聊&#xff0c;命令是 搜剧影视关键词 如果无法搜索到影视资源&#xff0c;请使用下方命令&…

推特Twitter有直播功能吗?如何用Twitter直播?

现在各大直播平台已经成为社交媒体营销的一种重要渠道&#xff0c;它让品牌能够即时地与全球受众进行互动。据统计&#xff0c;直播市场正在迅速增长&#xff0c;预计到2028年将达到2230亿美元的规模。在这个不断扩张的市场中&#xff0c;许多社交媒体平台如YouTube、Facebook、…

【算法】单源最短路问题之Dijkstra算法

构建图 void TestGraphDijkstra(){const char* str "syztx";Graph<char, int, INT_MAX, true> g(str, strlen(str));g.AddEdge(s, t, 10);g.AddEdge(s, y, 5);g.AddEdge(y, t, 3);g.AddEdge(y, x, 9);g.AddEdge(y, z, 2);g.AddEdge(z, s, 7);g.AddEdge(z, x,…

【MySQL】13. 索引(重点)

1. 没有索引&#xff0c;可能会有什么问题 索引&#xff1a;提高数据库的性能&#xff0c;索引是物美价廉的东西了。 不用加内存&#xff0c;不用改程序&#xff0c;不用调sql&#xff0c;只要执行正确的 create index &#xff0c;查询速度就可能提高成百上千倍。 但是天下没…

SD卡备份和烧录ubuntu20.04镜像

设备及系统&#xff1a;nuc幻影峡谷工控机&#xff0c;ubuntu20.04&#xff0c;树莓派4B&#xff0c;SD卡读卡器 一、确定SD卡设备号的两种方法 方法1&#xff1a; 将有ubuntu镜像的SD卡插入读卡器&#xff0c;再将读卡器插入电脑主机&#xff0c;在 工具 中打开 磁盘&#…

k8s入门到实战(十二)—— pod的深入理解

pod 深入理解 pod 容器生命周期 pod 的几种状态 可以使用命令kubectl get pod -w实时监控查看 pod 的状态 running&#xff1a;正常运行状态Pending&#xff1a;资源分配不对的时候会挂起&#xff0c;出现此状态Terminating&#xff1a;某个节点突然关机&#xff0c;上面的 p…

[DS]Polar靶场web(一)

静以养心&#xff0c;宽以养气。 跟着Dream ZHO大神学专升安的一天 swp 直接dirb扫出.index.php.swp的目录 function jiuzhe($xdmtql){return preg_match(/sys.*nb/is,$xdmtql);//如果包含以 "sys" 开始&#xff0c;后跟任意字符直到 "nb" 的字符串&…

JavaScript中的继承方式详解

Question JavaScript实现继承的方式&#xff1f; 包含原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承和ES6 类继承 JavaScript实现继承的方式 在JavaScript中&#xff0c;实现继承的方式多种多样&#xff0c;每种方式都有其优势和适用场景。以下…

macOS Sonoma 14.4.1 (23E224) 正式版 Boot ISO 原版可引导镜像下载

macOS Sonoma 14.4.1 (23E224) 正式版 Boot ISO 原版可引导镜像下载 2024 年 3 月 26 日凌晨&#xff0c;macOS Sonoma 14.4.1 更新修复了一个可能导致连接到外部显示器的 USB 集线器无法被识别的问题。它还解决了可能导致 Java 应用程序意外退出的问题&#xff0c;并修复了可…

Spring 事务传播行为

实现原理 : Aop (TransactionInterceptor) 实现 使用spring声明式事务注意事项 同一个bean中的方法调用必须重新声明一个bean调用、否则后续方法调用的事务默认使用第一个第二个不生效 package com.cloud.person.service.impl;import com.cloud.person.dao.S1Mapper; import…

STM32常用的开发工具有哪些

大家好&#xff0c;今天给大家介绍STM32常用的开发工具有哪些&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 STM32常用的开发工具主要包括以下几类&#xff1a; 集成开发环境&…