题目:

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

请你找出并返回只出现一次的那个数。

你设计的解决方案必须满足 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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/single-element-in-a-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

【二分查找】

看到题目要求:解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度,就会想到用过二分查找!但是二分条件一般是中间值和目标值相比较,这里一直卡在寻找目标值,自己没想出来,参考:@(彤哥来刷题)老师的思路:https://leetcode.cn/problems/single-element-in-a-sorted-array/solution/tong-ge-lai-shua-ti-la-er-fen-cha-zhao-b-x8dd/

题目中说了只有一个数出现一次,其他数出现两次,那么这个数组长度肯定为奇数,采用二分法缩小搜索范围,肯定会把数组分为一边是偶数个数,一边是奇数个数。且把单独数补上,例如[3,3,7,7,10,11,11]--> [3,3,7,7,10,10,11,11],可以观察到[偶数下标,奇数下标]的数肯定相等。

那么具体的二分查找过程为:

  • 初始化左右边界:left = 0,right = nums.length - 1,计算出mid = left + (right - left) / 2,循环条件是:left < right;
  • 如果mid为偶数,由于数组下标是从0开始的,mid之前(包括mid)一共有奇数个数,mid后面有偶数个数,于是就判断nums[mid]与nums[mid+1]是否相等:
    • 如果nums[mid] == nums[mid+1],则说明后面剩余的数为奇数个了,则单独数出现在后面,即让left = mid +1;
    • 如果nums[mid] != nums[mid+1],则说明要么mid就为单独数,要么单独数出现在前面,即让right = mid。
  • 如果mid为奇数,mid之前(包括mid)一共有偶数个数,mid后面有奇数个数,于是就判断nums[mid]与nums[mid-1]是否相等:
    • 如果nums[mid-1] == nums[mid],则说明单独数出现在后面,即让left = mid +1;
    • 如果nums[mid-1] != nums[mid],则说明要么mid为单独数,要么单独数出现在后面,即让right = mid。
  • 循环结束条件:left == right,直接返回left 或者right即可。

java代码:

 1 class Solution {
2 public int singleNonDuplicate(int[] nums) {
3 int left = 0, right = nums.length - 1;
4 while (left < right){
5 int mid = left + (right - left) / 2;
6 //mid为偶数,包括mid以及之前有奇数个数
7 if (mid % 2 == 0){
8 //mid和mid+1相等,表示单独数出现在后面
9 if (nums[mid] == nums[mid + 1]){
10 left = mid + 1;
11 }else{
12 //mid和mid+1不相等,表示单独数出现在前面
13 right = mid;
14 }
15 }else{
16 //mid为奇数,包括mid以及之前有偶数个数
17 //mid和mid-1相等,说明单独数出现在后面
18 if(nums[mid-1] == nums[mid]){
19 left = mid + 1;
20 }else{
21 //mid和mid-1不相等,说明单独数出现在前面
22 right = mid;
23 }
24 }
25 }
26 return nums[left];
27 }
28 }

java二分查找-异或:

异或:相同为0,不同为1,偶数异或相当于加1,奇数异或相当于减1。

 1 class Solution {
2 public int singleNonDuplicate(int[] nums) {
3 int left = 0, right = nums.length - 1;
4 while (left < right){
5 int mid = left + (right - left) / 2;
6 //mid为偶数,包括mid以及之前有奇数个数
7 //mid和mid+1相等,表示单独数出现在后面
8 if (nums[mid] == nums[mid ^ 1]){
9 left = mid + 1;
10 }else{
11 //mid和mid+1不相等,表示单独数出现在前面
12 right = mid;
13 }
14 }
15 return nums[left];
16 }
17 }

 python3代码-异或:

 1 class Solution:
2 def singleNonDuplicate(self, nums: List[int]) -> int:
3 left, right = 0, len(nums) - 1
4 while left < right:
5 mid = left + (right - left) // 2
6 if nums[mid] == nums[mid ^ 1]:
7 left = mid + 1
8 else:
9 right = mid
10 return nums[left]

力扣540(java&python)-有序数组中的单一元素(中等)的更多相关文章

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

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

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

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

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

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

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

  5. [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 ...

  6. Java-Runoob-高级教程-实例-数组:14. Java 实例 – 在数组中查找指定元素

    ylbtech-Java-Runoob-高级教程-实例-数组:14. Java 实例 – 在数组中查找指定元素 1.返回顶部 1. Java 实例 - 在数组中查找指定元素  Java 实例 以下实例 ...

  7. Java-Runoob-高级教程-实例-数组:10. Java 实例 – 查找数组中的重复元素-un

    ylbtech-Java-Runoob-高级教程-实例-数组:10. Java 实例 – 查找数组中的重复元素 1.返回顶部 1. Java 实例 - 查找数组中的重复元素  Java 实例 以下实例 ...

  8. 去掉有序数组中的重复元素 c/c++

    去掉有序数组中的重复元素: int RemoveDuplates(int A[], int nCnt) { ; ; , j = ; i < nCnt && j < nCnt ...

  9. Java如何从数组中查找对象元素?

    在Java中,如何从数组中查找对象元素? 示例 以下示例使用Contains方法来搜索数组中的String对象. package com.yiibai; import java.util.*; pub ...

  10. LeetCode#26 | Remove Duplicates from Sorted Array 删除有序数组中的重复元素

    一.题目 Description Given a sorted array, remove the duplicates in-place such that each element appear ...

随机推荐

  1. 芯片公司Dialog产品调研简报

    一 公司简介: Dialog半导体有限公司的总部位于伦敦,设有一个全球销售.研发和营销部.2013年,公司实现了9.10亿美元的营业收入,是欧洲增长速度最快的公共半导体公司之一.   二 芯片型号: ...

  2. 安装完exe版本jdk之后未配置java_home和path环境变量仍然可以在cmd中使用java命令原因解释

    如题: 为何可以 打出Java -version的版本 ,因为jdk安装过程,拷贝了java\javac等几个命令到C:\windows\system32目录了. 如果使用javac -version ...

  3. python基础笔记((1)

    逻辑与或非用的是and or not. 除法即使整除结果也是浮点数 地板除//结果一定是整数. 内存中的字符串是Unicode编码,str.encode('utf-8 or ascii')将class ...

  4. 开发一个本地的供需求平台软件小程序单靠广告费就能月入3w+,你觉得香不香!

    最近合作了一个客户,需求是把现成的这种网站包装成App,在各大应用商店也能下载,做用户留存. 需求不复杂,现在已经完工了.事后处于好奇我又分析了一下这个项目的商业模式发现还挺好的,看前台数据基本上已经 ...

  5. 记录--开局一张图,构建神奇的 CSS 效果

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 假设,我们有这样一张 Gif 图: 利用 CSS,我们尝试来搞一些事情. 图片的 Glitch Art 风 在这篇文章中 --CSS 故障 ...

  6. 【已失效】Xcode GUI 添加 SPM 依赖的时候访问不了 github,无视 git config proxy 配置解决方案

    此 openradar 中提出者指出了原因:Xcode 调用 libgit2 时传入了 GIT_PROXY_NONE,无视了 git config 中的 proxy 配置.作者说用了自己打的 libg ...

  7. C# PaddleOCR 车牌识别

    效果 车牌识别测试地址 http://47.108.88.211/manual/VehPlateTest.html 通用OCR识别测试地址 http://47.108.88.211/manual/OC ...

  8. 数字集成电路设计之CMOS

    数字集成电路设计理论 1.基本的理论结构 现在主流的集成电路器件还是CMOS,所以理论的结构还是基于CMOS.CMOS有N和P两种MOS组合组合在一起.CMOS最简单的器件就是反相器.然后是标准的逻辑 ...

  9. JDBC访问KingbaseES数据库异常 -- 案例分析

    应用使用jdbc访问KingbaseES数据库发生异常:SocketTimeoutException Read timed out 一.异常现象: 应用显示ERROR信息: Caused By: ja ...

  10. java反序列化-CC1

    CC1 目录 CC1 1.Transformer接口 2.Transformer的实现类 ConstantTransformer ChainedTransformer InvokerTransform ...