力扣540(java&python)-有序数组中的单一元素(中等)
题目:
给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。
请你找出并返回只出现一次的那个数。
你设计的解决方案必须满足 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
提示:
- 1 <= nums.length <= 105
- 0 <= nums[i] <= 105
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/single-element-in-a-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
【二分查找】
看到题目要求:解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度,就会想到用过二分查找!但是二分条件一般是中间值和目标值相比较,这里一直卡在寻找目标值,自己没想出来,参考:@(彤哥来刷题)老师的思路:https://leetcode.cn/problems/single-element-in-a-sorted-array/solution/tong-ge-lai-shua-ti-la-er-fen-cha-zhao-b-x8dd/
题目中说了只有一个数出现一次,其他数出现两次,那么这个数组长度肯定为奇数,采用二分法缩小搜索范围,肯定会把数组分为一边是偶数个数,一边是奇数个数。且把单独数补上,例如[3,3,7,7,10,11,11]--> [3,3,7,7,10,10,11,11],可以观察到[偶数下标,奇数下标]的数肯定相等。
那么具体的二分查找过程为:
- 初始化左右边界:left = 0,right = nums.length - 1,计算出mid = left + (right - left) / 2,循环条件是:left < right;
- 如果mid为偶数,由于数组下标是从0开始的,mid之前(包括mid)一共有奇数个数,mid后面有偶数个数,于是就判断nums[mid]与nums[mid+1]是否相等:
- 如果nums[mid] == nums[mid+1],则说明后面剩余的数为奇数个了,则单独数出现在后面,即让left = mid +1;
- 如果nums[mid] != nums[mid+1],则说明要么mid就为单独数,要么单独数出现在前面,即让right = mid。
- 如果mid为奇数,mid之前(包括mid)一共有偶数个数,mid后面有奇数个数,于是就判断nums[mid]与nums[mid-1]是否相等:
- 如果nums[mid-1] == nums[mid],则说明单独数出现在后面,即让left = mid +1;
- 如果nums[mid-1] != nums[mid],则说明要么mid为单独数,要么单独数出现在后面,即让right = mid。
- 循环结束条件:left == right,直接返回left 或者right即可。
java代码:
1 class Solution {
2 public int singleNonDuplicate(int[] nums) {
3 int left = 0, right = nums.length - 1;
4 while (left < right){
5 int mid = left + (right - left) / 2;
6 //mid为偶数,包括mid以及之前有奇数个数
7 if (mid % 2 == 0){
8 //mid和mid+1相等,表示单独数出现在后面
9 if (nums[mid] == nums[mid + 1]){
10 left = mid + 1;
11 }else{
12 //mid和mid+1不相等,表示单独数出现在前面
13 right = mid;
14 }
15 }else{
16 //mid为奇数,包括mid以及之前有偶数个数
17 //mid和mid-1相等,说明单独数出现在后面
18 if(nums[mid-1] == nums[mid]){
19 left = mid + 1;
20 }else{
21 //mid和mid-1不相等,说明单独数出现在前面
22 right = mid;
23 }
24 }
25 }
26 return nums[left];
27 }
28 }

java二分查找-异或:
异或:相同为0,不同为1,偶数异或相当于加1,奇数异或相当于减1。
1 class Solution {
2 public int singleNonDuplicate(int[] nums) {
3 int left = 0, right = nums.length - 1;
4 while (left < right){
5 int mid = left + (right - left) / 2;
6 //mid为偶数,包括mid以及之前有奇数个数
7 //mid和mid+1相等,表示单独数出现在后面
8 if (nums[mid] == nums[mid ^ 1]){
9 left = mid + 1;
10 }else{
11 //mid和mid+1不相等,表示单独数出现在前面
12 right = mid;
13 }
14 }
15 return nums[left];
16 }
17 }

python3代码-异或:
1 class Solution:
2 def singleNonDuplicate(self, nums: List[int]) -> int:
3 left, right = 0, len(nums) - 1
4 while left < right:
5 mid = left + (right - left) // 2
6 if nums[mid] == nums[mid ^ 1]:
7 left = mid + 1
8 else:
9 right = mid
10 return nums[left]

力扣540(java&python)-有序数组中的单一元素(中等)的更多相关文章
- Java实现 LeetCode 540 有序数组中的单一元素(位运算入门)
540. 有序数组中的单一元素 给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数. 示例 1: 输入: [1,1,2,3,3,4,4,8,8] 输出: 2 示例 ...
- LeetCode 540. 有序数组中的单一元素(Single Element in a Sorted Array) 42
540. 有序数组中的单一元素 540. Single Element in a Sorted Array 题目描述 每日一算法2019/6/14Day 42LeetCode540. Single E ...
- Leetcode 540.有序数组中的单一元素
有序数组中的单一元素 给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数. 示例 1: 输入: [1,1,2,3,3,4,4,8,8] 输出: 2 示例 2: 输入 ...
- 540 Single Element in a Sorted Array 有序数组中的单一元素
给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数.示例 1:输入: [1,1,2,3,3,4,4,8,8]输出: 2 示例 2:输入: [3,3,7,7,10,1 ...
- [Swift]LeetCode540. 有序数组中的单一元素 | Single Element in a Sorted Array
Given a sorted array consisting of only integers where every element appears twice except for one el ...
- Java-Runoob-高级教程-实例-数组:14. Java 实例 – 在数组中查找指定元素
ylbtech-Java-Runoob-高级教程-实例-数组:14. Java 实例 – 在数组中查找指定元素 1.返回顶部 1. Java 实例 - 在数组中查找指定元素 Java 实例 以下实例 ...
- Java-Runoob-高级教程-实例-数组:10. Java 实例 – 查找数组中的重复元素-un
ylbtech-Java-Runoob-高级教程-实例-数组:10. Java 实例 – 查找数组中的重复元素 1.返回顶部 1. Java 实例 - 查找数组中的重复元素 Java 实例 以下实例 ...
- 去掉有序数组中的重复元素 c/c++
去掉有序数组中的重复元素: int RemoveDuplates(int A[], int nCnt) { ; ; , j = ; i < nCnt && j < nCnt ...
- Java如何从数组中查找对象元素?
在Java中,如何从数组中查找对象元素? 示例 以下示例使用Contains方法来搜索数组中的String对象. package com.yiibai; import java.util.*; pub ...
- LeetCode#26 | Remove Duplicates from Sorted Array 删除有序数组中的重复元素
一.题目 Description Given a sorted array, remove the duplicates in-place such that each element appear ...
随机推荐
- labeImg 遇到闪退问题,TypeError: setValue(self, a0: int): argument 1 has unexpected type 'float'
将python 环境安装为python3.9,然后重新安装labelImg
- JavaFx 模拟键盘和鼠标事件
模拟键盘事件 可实现按键的模拟,包含快捷键 模拟按下ctrl+v示例代码: val robot = Robot() robot.keyPress(KeyEvent.VK_CONTROL) robot. ...
- 掌握Python库的Bokeh,就能让你的交互炫目可视化
本文分享自华为云社区<Bokeh图形魔法:掌握绘图基础与高级技巧,定制炫目可视化>,作者: 柠檬味拥抱. Bokeh是一个用于创建交互式可视化图形的强大Python库.它不仅易于使用,而且 ...
- [LeetCode] 2045. 到达目的地的第二短时间
一.摘要 本文介绍了一种使用BFS求无向图中第二短的距离的算法,本文算法参考自Python3 BFS找出第二短路径.通过使用BFS求出题目中给出的路径图(无向联通图)从节点1到节点n的第二短的路径,再 ...
- 【UE虚幻引擎】干货!UE修改分辨率的3种方法
虚幻引擎作为一款实时3D创作工具,在游戏.建筑.影视动画.虚拟仿真等领域受到全球各行各业创作者广泛欢迎,在UE中获取和设置分辨率也是3D创作开发工作中的常用功能.本文介绍了在虚幻引擎中修改分辨率的3种 ...
- 3DCAT首届行业生态交流会|燧光CTO 戴景文:云渲染 XR大发展的助推器
2021年12月17日下午,由深圳市瑞云科技有限公司主办,深圳市虚拟现实产业联合会协办的 云XR如何赋能元宇宙--3DCAT实时云渲染首届行业生态合作交流会 圆满落幕.此次活动围绕"云XR如 ...
- KingbaseES V8R3集群运维案例之---流复制异步同步及全同步模式配置
案例说明: 通过案例描述KingbaseES V8R3集群异步.同步及全同步强一致性配置,本案例为一主二备的架构. 适用版本: KingbaseES V8R3 集群架构: 集群复制配置参数说明: 1) ...
- KingbaseES V8R6 索引膨胀
索引膨胀 对于索引,随着业务不断的增删改,会造成膨胀,尤其Btree索引,也会涉及索引分裂.合并等,导致索引访问效率降低.维护成本增加.另外,索引页的复用与HEAP PAGE不一样,因为索引的内容是有 ...
- 基于 alientek rv1126 快速启动调试那的写坑
基于 alientek rv1126 快速启动调试那的写坑 1. sdk 编制准备工作 1.1 编译配置修改 首先拿到 sdk 通过修改一下相关配置 1.1.1修改DDR 配置 cd /home/al ...
- 测试开发之系统篇-Docker常用操作
Docker容器(Container)的运行基于镜像(image),您可以在Docker Hub上检索,或通过Dockerfile文件自己构建镜像. 首先拉取MySQL官方镜像的最新版(latest) ...