LeetCode 540. Single Element in a Sorted Array
LeetCode 540. Single Element in a Sorted Array (有序数组中的单一元素)
题目
链接
https://leetcode-cn.com/problems/single-element-in-a-sorted-array/
问题描述
给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。
请你找出并返回只出现一次的那个数。
你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。
示例
输入: nums = [1,1,2,3,3,4,4,8,8]
输出: 2
提示
1 <= nums.length <= 10^5
0 <= nums[i] <= 10^5
思路
由题意,一共有奇数个数,排练为 偶,奇,偶,奇,这样,最后一个数为奇数。
如果全部取异或,可以直接得到答案,或者是遍历,但是这样都是O(n)。
采用二分方法,可以更快。
- l为0,r为长度减一,这二者是数组下标,m为二者中间值。
- 获取m,若为奇数,则往前一位,若为偶数,直接运算。
- nums[m]和后一位数进行判断,相同的话,就代表插入位置在m+2到r中,不同的话,就是在l到m中。
- 最后得到结果。
复杂度分析
时间复杂度 O(logn)
空间复杂度 O(1)
代码
Java
public static int singleNonDuplicate(int[] nums) {
int n = nums.length;
int l = 0, r = n - 1;
while (l < r) {
int m = (r - l) / 2 + l;
if (m % 2 == 1) {
m--;
}
if (nums[m] == nums[m + 1]) {
l = m + 2;
} else {
r = m;
}
}
return nums[l];
}
分类:
LeetCode(Java)
标签:
二分查找
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了