来源:力扣(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];
}
};

运行结果

LeetCode-540 有序数组中单一元素的更多相关文章

  1. LeetCode 540. 有序数组中的单一元素(Single Element in a Sorted Array) 42

    540. 有序数组中的单一元素 540. Single Element in a Sorted Array 题目描述 每日一算法2019/6/14Day 42LeetCode540. Single E ...

  2. Java实现 LeetCode 540 有序数组中的单一元素(位运算入门)

    540. 有序数组中的单一元素 给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数. 示例 1: 输入: [1,1,2,3,3,4,4,8,8] 输出: 2 示例 ...

  3. Leetcode 540.有序数组中的单一元素

    有序数组中的单一元素 给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数. 示例 1: 输入: [1,1,2,3,3,4,4,8,8] 输出: 2 示例 2: 输入 ...

  4. LeetCode 5126. 有序数组中出现次数超过25%的元素 Element Appearing More Than 25% In Sorted Array

    地址 https://leetcode-cn.com/contest/biweekly-contest-15/problems/element-appearing-more-than-25-in-so ...

  5. [LeetCode] 34. Find First and Last Position of Element in Sorted Array 在有序数组中查找元素的第一个和最后一个位置

    Given an array of integers nums sorted in ascending order, find the starting and ending position of ...

  6. 【LeetCode】1464. 数组中两元素的最大乘积 Maximum Product of Two Elements in an Array (Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力 找最大次大 日期 题目地址:https://le ...

  7. [Leetcode]在排序数组中查找元素的第一个和最后一个位置

    题目 代码 class Solution { public: vector<int> searchRange(vector<int>& nums, int target ...

  8. 【LeetCode每天一题】Find First and Last Position of Element in Sorted Array(找到排序数组中指定元素的开始和结束下标)

    Given an array of integers nums sorted in ascending order, find the starting and ending position of ...

  9. 540 Single Element in a Sorted Array 有序数组中的单一元素

    给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数.示例 1:输入: [1,1,2,3,3,4,4,8,8]输出: 2 示例 2:输入: [3,3,7,7,10,1 ...

  10. [Swift]LeetCode540. 有序数组中的单一元素 | Single Element in a Sorted Array

    Given a sorted array consisting of only integers where every element appears twice except for one el ...

随机推荐

  1. eval解析的函数传参 object array

    1 const fn = (...args) => { 2 console.log(...args) 3 } 4 5 const handleEval = (fnName,...args) =& ...

  2. 深入浅出OSI七层参考

    本篇博客是笔者阅读<图解TCP/IP>所记录下的笔记,有兴趣的朋友可以去看一看这本书. OSI七层参考模型 ​ 本小节以电子邮件通信为例,分别来阐述OSI七层模型的每一层是如果进行通信处理 ...

  3. 什么是django中间件?(七个中间件-自定义中间件)

    目录 一:django中间件 1.什么是django中间件 2.django请求生命周期流程图 二:django自带七个中间件 1.研究django中间件代码规律 2.django支持程序员自定义中间 ...

  4. 解决 ERROR: Could not find a version that satisfies the requirement xxx 的问题

    解决 ERROR: Could not find a version that satisfies the requirement xxx 的问题 1.解决 ERROR: Could not find ...

  5. 论文解读(CAN)《Contrastive Adaptation Network for Unsupervised Domain Adaptation》

    论文信息 论文标题:Contrastive Adaptation Network for Unsupervised Domain Adaptation论文作者:Guoliang Kang, Lu Ji ...

  6. [数据分析与可视化] 数据绘图要点2-Y轴的开始与结束

    数据绘图要点2-Y轴的开始与结束 切割或不切割Y轴可能是数据可视化中最具争议的话题之一.基本上,主要问题在于 Y 轴是否应始终从零开始.数据可视化的目的是讲述一个故事,图形表达方式会对可视化讲述的故事 ...

  7. 《Effective C++》关于const,define等总结

    (将每一条item的总结和自己的理解给记录下来,以后有需要的话可以再回头参阅这些资料,不懂的再翻书温故.) Item 02:尽量以const ,enum,inline替换#define #define ...

  8. uniapp 开发微信小程序问题笔记

    最近接手了一个小程序开发,从头开始.使用了 uniapp 搭建,以前没有做过小程序开发,着手看文档.查文档.一步一步完成了任务的开发.特此记录开发过程中的问题. 开发建议: 使用 HBuilderX ...

  9. Flutter2.X学习之路--调试页面布局好用的办法

    Flutter里有个很好用的东西,可以方便我们来进行页面组件的布局调试,话不多说,上代码 1.找到main.dart引入rendering.dart import 'package:flutter/r ...

  10. 程序员必备的数据库知识 2:Join 算法

    前言 连接(Join)是关系数据库重要特性,它和事务常被作为数据库与文件系统的两个重要区别项.程序员江湖一直流传着某某 baba 的神秘开发宝典,其中数据库部分有重要一条避免过多表的 Join,奈何 ...