Leetcode 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
思路:
因为题目要求时间复杂度是O(logn),所以可以思考使用二分法(二分法的时间复杂度是O(logn))。
由于题目给的是有序数组,且大多数元素出现两次,只有一个出现一次,所以这个数组的长度肯定是个奇数。所以可以使用二分法划分数组,长度为奇数的那部分数组肯定含有我们寻找的目标数值。
当我们找到了长度为奇数的部分,还要考虑吧与当前mid值相同的数值出现在mid的左边还是右边,并且还要考虑把该相同元素去除之后,这部分剩下的长度是奇数还是偶数。
代码:
class Solution {
public int singleNonDuplicate(int[] nums) {
int n=nums.length;
if(n==0) return 0;
int start=0,end=n-1;
while(start<end){
int mid=start+(end-start)/2;
boolean isOdd=(end-mid)%2==0;
if(nums[mid]==nums[mid+1]){
if(isOdd){
start=mid+2;
}else{
end=mid-1;
}
}else if(nums[mid]==nums[mid-1]){
if(isOdd){
end=mid-2;
}else{
start=mid+1;
}
}else{
return nums[mid];
}
}
return nums[start];
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了