540.有序数组中的单一元素
【LetMeFly】540.有序数组中的单一元素:二分查找(位运算优化)
力扣题目链接:https://leetcode.cn/problems/single-element-in-a-sorted-array/
给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。
请你找出并返回只出现一次的那个数。
你设计的解决方案必须满足 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
解题方法:二分查找
数组元素有序说明,我们可以直接随机选择一个下标,如果“当前下标为偶数且当前元素和下一个元素相同”或者“当前下标为奇数并且当前元素和上一个元素相同”,则说明从头开始到这个元素为止每个元素都是成对出现的。
因此我们可以直接进行二分操作:每次枚举mid并在$O(1)$的时间内得到$[0, mid]$中的每个元素是否都成对出现。若成对出现则说明答案在$mid + 1$及之后;否则说明答案在$mid$及之前。
位运算优化:
- $\frac{l+r}2=(l+r)>>1$
- 如果$mid$是奇数,那么应该判断$nums[mid]$是否和$nums[mid - 1]$相等;如果$mid$是偶数,那么应该判断$nums[mid]$是否和$nums[mid + 1]$相等。总之,我们只需要判断$nums[mid]$和$nums[mid \hat\ 1]$是否相等(其中$\hat\ $是异或符)
(・∀・(・∀・(・∀・*)
- 时间复杂度$O(\log len(nums))$
- 空间复杂度$O(1)$
AC代码
C++
1 |
|
Python
1 |
|
Java
1 |
|
Go
1 |
|
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/143663976
emm,某事还是很累,这篇题解写地晕哩糊涂的。
540.有序数组中的单一元素
https://blog.letmefly.xyz/2024/11/10/LeetCode 0540.有序数组中的单一元素/