作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/


题目地址:https://leetcode.com/problems/single-element-in-a-sorted-array/description/

题目描述

Given a sorted array consisting of only integers where every element appears twice except for one element which appears once. Find this single element that appears only once.

Example 1:

  1. Input: [1,1,2,3,3,4,4,8,8]
  2. Output: 2

Example 2:

  1. Input: [3,3,7,7,10,11,11]
  2. Output: 10

解题方法

方法一:异或

一个数组中,每个数字都出现了两次,只有一个数字出现了一次,求出现一次的数字。这样的题目使用异或操作遍历一遍即可。原理是:

  1. 相同元素的异或操作是0;
  2. 0与任何元素的异或操作结果是该数字;
  3. 异或操作具有交换律和结合律。
  1. class Solution(object):
  2. def singleNonDuplicate(self, nums):
  3. """
  4. :type nums: List[int]
  5. :rtype: int
  6. """
  7. return reduce(lambda x, y: x^y, nums)

C++代码如下:

  1. class Solution {
  2. public:
  3. int singleNonDuplicate(vector<int>& nums) {
  4. int res = 0;
  5. for (int a : nums) res ^= a;
  6. return res;
  7. }
  8. };

方法二:判断相邻元素是否相等

这个方法应该比上面的方法好想一点。题目中已经说了是有序的数组,那么相等的元素必相邻,找到第一个和后面元素不等的数字即为所求。为了防止数组越界,只遍历到len(nums)-1处,如果遍历结束没有找到,则为最后一个元素。

  1. class Solution(object):
  2. def singleNonDuplicate(self, nums):
  3. """
  4. :type nums: List[int]
  5. :rtype: int
  6. """
  7. for i in range(0, len(nums) - 1, 2):
  8. if nums[i] != nums[i + 1]:
  9. return nums[i]
  10. return nums[-1]

C++代码如下:

  1. class Solution {
  2. public:
  3. int singleNonDuplicate(vector<int>& nums) {
  4. int pos = 0;
  5. const int N = nums.size();
  6. while (pos < N) {
  7. if (nums[pos] != nums[pos + 1])
  8. return nums[pos];
  9. pos += 2;
  10. }
  11. return nums[N - 1];
  12. }
  13. };

方法三:二分查找

这个二分查找的思路很奇特。如果i是个偶数,如果nums[i] == nums[i + 1],那么,说明那个单独出现的元素在i的右边;如果nums[i] != nums[i + 1],那么说明单独出现的元素在i的左边。所以这个题其实考的lower_bound的写法。

Python的写法如下:

  1. class Solution(object):
  2. def singleNonDuplicate(self, nums):
  3. """
  4. :type nums: List[int]
  5. :rtype: int
  6. """
  7. N = len(nums)
  8. left, right = 0, N - 1 #[left, right]
  9. while (left < right):
  10. mid = left + (right - left) / 2
  11. if mid % 2 == 1: mid -= 1
  12. if nums[mid] != nums[mid + 1]:
  13. right = mid
  14. else:
  15. left = mid + 2
  16. return nums[left]

C++代码如下:

  1. class Solution {
  2. public:
  3. int singleNonDuplicate(vector<int>& nums) {
  4. const int N = nums.size();
  5. int left = 0, right = N - 1;
  6. while (left < right) {
  7. int mid = (right - left) / 2 + left;
  8. if (mid % 2 == 1) mid--;
  9. if (nums[mid] != nums[mid + 1])
  10. right = mid;
  11. else
  12. left = mid + 2;
  13. }
  14. return nums[left];
  15. }
  16. };

日期

2018 年 2 月 6 日
2018 年 12 月 7 日 —— 恩,12月又过去一周了

【LeetCode】540. Single Element in a Sorted Array 解题报告(Python & C++)的更多相关文章

  1. LeetCode - 540. Single Element in a Sorted Array

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

  2. LeetCode——540. Single Element in a Sorted Array

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

  3. 【LeetCode】26. Remove Duplicates from Sorted Array 解题报告(Python&C++&Java)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双指针 日期 [LeetCode] https:// ...

  4. 【LeetCode】Find Minimum in Rotated Sorted Array 解题报告

    今天看到LeetCode OJ题目下方多了"Show Tags"功能.我觉着挺好,方便刚開始学习的人分类练习.同一时候也是解题时的思路提示. [题目] Suppose a sort ...

  5. 【leetcode】540. Single Element in a Sorted Array

    题目如下: 解题思路:题目要求时间复杂度是O(logN),可以尝试使用二分查找法.首先数组是有序的,而且仅有一个元素出现一次,其余均为两次.我们可以先找到数组最中间的元素,记为mid.如果mid和mi ...

  6. 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 ...

  7. 540. Single Element in a Sorted Array

    题目大意: 给你一个由小到大排好序的数组,里面只有一个数出现了一次,其他数都出现了两次,要求找出那个只出现一次的数,而且时间复杂度为O(logn) 题目思路: 说实话一开始没想到,因为几乎每个数都出现 ...

  8. 【LeetCode】1150. Check If a Number Is Majority Element in a Sorted Array 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 二分查找 日期 题目地址:https://lee ...

  9. 【LeetCode】977. Squares of a Sorted Array 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序 日期 题目地址:https://leetcod ...

随机推荐

  1. logname

    logname命令用来显示用户名称. 语法 logname(选项) 选项 --help:在线帮助: --vesion:显示版本信息.

  2. Linux系统的开机启动顺序

    Linux系统的开机启动顺序加载BIOS–>读取MBR–>Boot Loader–>加载内核–>用户层init一句inittab文件来设定系统运行的等级(一般3或者5,3是多用 ...

  3. 48-Merge Sorted Array

    $88. Merge Sorted Array My Submissions QuestionEditorial Solution Total Accepted: 98885 Total Submis ...

  4. 标准非STL容器 : bitset

    1. 概念 什么是"标准非STL容器"?标准非STL容器是指"可以认为它们是容器,但是他们并不满足STL容器的所有要求".前文提到的容器适配器stack.que ...

  5. 卷积神经网络(Convolutional Neural Networks)CNN

     申明:本文非笔者原创,原文转载自:http://www.36dsj.com/archives/24006 自今年七月份以来,一直在实验室负责卷积神经网络(Convolutional Neural ...

  6. 联盛德 HLK-W806 (六): I2C驱动SSD1306 128x64 OLED液晶屏

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  7. WebRTC本地分享屏幕,录制屏幕

    WebRTC有分享屏幕的功能.使用的是getDisplayMedia方法.用户同意分享屏幕后,可以拿到视频流. 再结合MediaRecorder和Blob,把视频流数据存下来,就能得到录制屏幕的视频. ...

  8. 阿里云ECS磁盘性能测试

    阿里官方给出的性能指标 顺序读 测试命令 fio -directory=/var/lib/data -direct=1 -iodepth=1 -thread -ioengine=libaio -ran ...

  9. 关于learning Spark中文版翻译

      在网上找了很久中文版,感觉都是需要支付一定金币才能下载,索性自己翻译算了.因为对Spark有一定了解,而且书籍前面写道,对Spark了解可以直接从第三章阅读,就直接从第三章开始翻译了,应该没有什么 ...

  10. 使用springboot配置和注入数据源属性的方法和步骤

    /** 1.书写一个名为resources/application.properties的属性文件---->书写一个配置属性类,类名为: **/ 文件:application.propertie ...