难度:中等

目录

一、问题描述

二、思路

1、解题思路

1.思路一

2.思路二

2、极端情况判断

3、极端情况解决

三、解题

1、代码实现

1.方法一

2.方法二

2、时间复杂度 and 空间复杂度

1.方法一

2.方法二


一、问题描述

这里直接采用LeetCode上面的描述。

给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。请你找出并返回只出现一次的那个数。

你设计的解决方案必须满足 时间复杂度和 空间复杂度。

下面给出示例:

提示:

  • 1 <= nums.length <= 105
  • 0 <= nums[i] <= 105

二、思路

1、解题思路

1.思路一

这里题目中给出的要求有:

  • 时间复杂度
  • 空间复杂度

很明显是需要使用 二分查找 来解题。

题目中说明了 有序数组 且 每个元素都会出现两次,唯有一个数只会出现一次。那么查看示例我们可以发现:设当前下标为 x

  • 在出现 唯一数 之前,当 x 为偶数时,则肯定是 满足 nums[ x ] = nums[ x + 1 ],若 x 是奇数,则肯定满足 nums[ x ] = nums[ x - 1 ]。
  • 出现了 唯一数 之后,当 x 为偶数时,则肯定是 满足 nums[ x ] = nums[ x - 1 ],若 x 是奇数,则肯定满足 nums[ x ] = nums[ x + 1 ]。

因此我们可以根据上述条件来进行 二分条件 的判断,因为 只会出现 一个 唯一数,所以数组 nums 的大小肯定是 奇数

我们假设当前下标为 x :

  • 如果 x 是奇数,则与 x 左边的数进行相等判断,不相等 则说明唯一数在 mid 的左边,相等 则说明 唯一数 在 x 的右边。
  • 如果 x 是偶数,则与 x 右边的数进行相等判断,不相等 则说明唯一数在 mid 的左边,相等 则说明唯一数在 x 的右边。

根据上面条件,可以写出二分查找 ,这里采用的是 异或( ^ ) 来区分当前 mid 的 奇偶性,确实特别巧妙。

2.思路二

我想到的是,每次进行跳跃两个元素的查找,直至查找到 nums[ x ] != nums[ x + 1 ] 的时候,那么 nums[ x ],肯定是那个 唯一元素

2、极端情况判断

  1. 对于方法二:这里需要注意的是,判断条件 不能让下标 x + 1 越界,那么就判断不到最后一个元素,并且判断不到 nums大小 为 1 的情况。

3、极端情况解决

  1. 可以发现如果判断到最后,都没发现唯一元素的话,那么唯一元素只能是最后一个;如果只有一个元素的话,那么唯一元素也是最后一个元素。所以解决办法就是,最后直接 return nums[ nums.size() - 1 ] ,即可。

三、解题

1、代码实现

1.方法一

class Solution {
public:int singleNonDuplicate(vector<int>& nums) {int left = 0, right = nums.size() - 1;while (left < right) {//每次都找到 left 与 right 中间的数 进行判断int mid = (right - left) / 2 + left;//这里采用与 1 异或 简直很完美 //因为 如果 mid 是奇数 则同左边数进行比较,如果 mid 是偶数 则同右边数进行比较//这里的二分条件为:俩数相等 那么肯定在 mid 右边出现唯一的数 if (nums[mid] == nums[mid ^ 1]) {left = mid + 1;}//如果不相等 则说明 顺序肯定是在左边被打乱的。 else {right = mid;}}return nums[left];}
};

2.方法二

class Solution {
public:int singleNonDuplicate(vector<int>& nums) {int numsLength = nums.size();for(int i = 0; i < numsLength - 1; i += 2){if(nums[i] == nums[i+1]){continue;}else{return nums[i];}}return nums[numsLength - 1];}
};

2、时间复杂度 and 空间复杂度

1.方法一

时间复杂度:

空间复杂度:

2.方法二

时间复杂度:

空间复杂度:

540.有序数组中的单一元素相关推荐

  1. 「 每日一练,快乐水题 」540. 有序数组中的单一元素

    ✅力扣原题: 力扣链接:540. 有序数组中的单一元素 ✅题目简述: 给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次. 请你找出并返回只出现一次的那个数. 你设计的解 ...

  2. 540. 有序数组中的单一元素 golang

    540. 有序数组中的单一元素 golang func singleNonDuplicate(nums []int) int {if len(nums) <= 1 {return nums[0] ...

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

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

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

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

  5. LeetCode 540. 有序数组中的单一元素(c语言实现)

    540. 有序数组中的单一元素 给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次. 请你找出并返回只出现一次的那个数. 你设计的解决方案必须满足 O(log n) 时间 ...

  6. LeetCode 540. 有序数组中的单一元素(位运算二分查找)

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

  7. LeetCode 540 有序数组中的单一元素

    题目描述 给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这 个数. 题解 二分查找 代码 class Solution { public:int singleNonD ...

  8. LeetCode 540.有序数组中的单一元素

    目录 题目 示例 C语言代码 逐个异或 正常遍历 题目 给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数. 示例 输入: nums = [1,1,2,3,3,4, ...

  9. 【数据结构与算法】之有序数组中的单一元素的算法

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

最新文章

  1. Linux环境编译安装Mysql以及补装innodb引擎方法
  2. Ubuntu架设FTP
  3. 成功解决 threading Exception unhandled RuntimeError
  4. javascript基本函数
  5. 【RobotStudio学习笔记】(八)速度设置
  6. 谷歌 analytics.js 简要分析
  7. mysql主从复制(master 、salve)
  8. visio 2013安装失败正在回滚
  9. 计算机网络实验:netmeeting 在局域网上的应用
  10. Android 一个adapter实现商品列表折叠
  11. word文档去掉复制过来的背景颜色
  12. 用MPI进行分布式内存编程(二)MPI_allreduce MPI_scatt MPI_bcast.....
  13. 【DB笔试面试594】在Oracle中,关键字NOLOGGING、APPEND和PARALLEL提高DML性能方面有什么差别?...
  14. 快递100接口使用整理
  15. 输入一个4位以内的正整数,输出各位数字之和
  16. 手写VIO学习总结(二)
  17. 找不到项目 该项不在计算机中,Win7删除文件夹找不到该项目怎么删除?“找不到该项目”强删方法...
  18. 将登记照图片尺寸宽高文件大小进行调整修改的工具
  19. 计算机初级证书 英语怎么说,常见职业资格证书英文翻译(含英语、计算机等)...
  20. (基础)001 - AWS Deepracer简介

热门文章

  1. 还在用print()查找错误?日志消息不香嘛? | 原力计划
  2. Go、Java、C++,下一代测序工具开发谁更强?
  3. 定了!百度运维工程师非法挖矿获利 10 万、被判 3 年,如何避免面向监狱编程?...
  4. 不用掉一根头发!用 Flutter + Dart 快速构建一款绝美移动 App
  5. GitHub 又又又挂了?
  6. PHP 没有真正的数组!
  7. 大势要落地!开发者应该关注的 AI 应用落地实践
  8. 阿里平头哥“生娃”!最强 RISC-V 处理器玄铁 910 诞生!
  9. 打造“5G+IoT”生态,共创产业繁荣沃土
  10. 有答案了!一张图告诉你到底学Python还是Java?你怎么选?