【二分查找】LeetCode 540. 有序数组中的单一元素
题目链接
思路
假如不存在单个的元素,那么在奇数位置上总是成对元素的第一个元素,偶数位置上总是成对元素的第二个元素,但是如果加入了单个元素呢?
我们可以看到在单个元素的左边这个特点没有变化,但是在单个元素的右边,奇数位置上总是成对元素的第二个元素,偶数位置上总是成对元素的第一个元素。
也就是说,如果单个元素在
如果单个元素在
利用这个区别,我们就知道应该收缩左边界还是右边界了。
代码
class Solution {
public int singleNonDuplicate(int[] nums) {
if(nums.length == 1){
return nums[0];
}
int left = 0;
int right = nums.length - 1;
while(left <= right){
int mid = (right - left) / 2 + left;
if(mid % 2 == 0){
if(mid + 1 < nums.length && nums[mid] == nums[mid + 1]){
left = mid + 1;
}else{
right = mid - 1;
}
}else{
if(mid - 1 >= 0 && nums[mid] == nums[mid - 1]){
left = mid + 1;
}else{
right = mid - 1;
}
}
}
return nums[left];
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)