来源:力扣(LeetCode)
链接:https://leetcode-cn.com/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

解题思路

本题难点在于限制了时间复杂度和空间复杂度,根据时间复杂度来看,很明显在诱导解题者使用二分法解题。

首先寻找规律,单一元素a的左边必然有偶数个元素,所以a的坐标必然是偶数,并且,a左边偶数坐标left的值均与left+1的值相同,右边偶数坐标right的值与right-1的值相同,所以,只需要找到这个分界点就是单一元素。

使用二分法,左边界left设置为0,右边界right设置为最大的偶数坐标,求出中间的偶数坐标mid(如果是奇数需要-1变成偶数坐标)判断是否nums[mid] == nums[mid + 1],如果相同,则a在mid的右边,并且mid不可能为单一元素,将left设置为mid + 2;否则,a可能在mid左边,也可能就是mid,所以将right设置为mid。

代码展示

class Solution {
public:
int singleNonDuplicate(vector<int>& nums) {
int iLeft = 0, iRight = nums.size() - 1, iMid = 0;
if(iRight % 2)
iRight--;
while(iLeft < iRight)
{
iMid = (iLeft + iRight) / 2;
if(iMid % 2)
iMid --;
if(nums[iMid] == nums[iMid + 1])
iLeft = iMid + 2;
else
iRight = iMid;
}
return nums[iLeft];
}
};

运行结果

最新文章

  1. 8款超实用JavaScript框架
  2. geoip scala api
  3. docker 初探
  4. WINDOWS 2008Server 配置nginx 反向代理服务器
  5. phonegap file操作
  6. Class TBoundlabel not found and so on..
  7. C++中const
  8. JAVA中的设计模式三(策略模式)
  9. 阿里云正式上线移动直播问答解决方案,助力APP尽情“撒币”!
  10. win7 64位安装redis 及Redis Desktop Manager使用(转载的)
  11. ROS学习笔记
  12. web页面实现文件下载的几种方法
  13. PyQt5——布局管理
  14. jenkins配置SSH远程服务器连接
  15. ES6 入门Promise
  16. NATS—消息通信模型
  17. 第7月第12天 opengles background
  18. 《高级Web应用程序设计》课程学习(20170911)
  19. 解决error possibly undefined macro AC_MSG_ERROR
  20. 循环 与 next()

热门文章

  1. Java中将 int[] 数组 转换为 List(ArrayList)
  2. 周结之json补充、正则re模块、hashlib模块、logging模块
  3. 搭建一个Hexo个人博客系统
  4. [机器学习] PCA (主成分分析)详解
  5. Mariadb对数据库和表的操作
  6. Linux基础操作-01
  7. 使用Dapr和.NET 6.0进行微服务实战:Dapr简介
  8. WeetCode4 —— 二叉树遍历与树型DP
  9. 腾讯出品小程序自动化测试框架【Minium】系列(三)元素定位详解
  10. redisConfig+redisUtil开箱即用