题目:

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

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

你设计的解决方案必须满足 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. vscode git冲突 1. git stash 2. 更新代码 3. git stash pop 4.提交代码

    vscode git冲突 1. git stash 2. 更新代码 3. git stash pop 4.提交代码

  2. ubuntu中在命令行如何打开图形界面的文件夹的几种方法

    方法一: 使用自带的命令:nautilus . 打开当前文件夹 nautilus . 打开指定路径文件夹 nautilus ddd/ccc/ 方法二:xdg-open xdg-open 命令相当于在 ...

  3. KTL 一个支持C++14编辑公式的K线技术工具平台 - 第九版,数据分析工具。支持通达信日线数据。增强即时插件编程体现。

    K,K线,Candle蜡烛图. T,技术分析,工具平台 L,公式Language语言使用c++14,Lite小巧简易. 项目仓库:https://github.com/bbqz007/KTL 国内仓库 ...

  4. JSF之常用注解

    @ManagedBean 以托管 bean 的形式注册一个类实例,然后将其放入到使用其中一个 @...Scoped 注释指定的范围内.如果没有指定任何范围,JSF 将把此 bean 放入请求范围,如果 ...

  5. Djaong 运行报错:ValueError: Unable to configure handler 'default'

    一.前提条件 1.Django 项目接入了 log 日志模块 二.解决方案 启动项目或者项目运行中,遇到如下报错 File "C:\Python38\lib\logging\config.p ...

  6. drf(请求和响应)

    一 请求 源码分析 from rest_framework.request import Request class Request: def __init__(self, request, pars ...

  7. openApi generator总是生成类名为 defaultApi

    生成器可以开启 useTags 设置,开启之后会根据 api 文档中的 tags 生成前缀类名,因此,要不生成 defaultApi 需要以下操作: 1.openApi 文档中每个 url 必须要有 ...

  8. 「AntV」景点轨迹数据获取与L7可视化

    1. 引言 L7 地理空间数据可视分析引擎是一种基于 WebGL 技术的地理空间数据可视化引擎,可以用于实现各种地理空间数据可视化应用.L7 引擎支持多种数据源和数据格式,包括 GeoJSON.CSV ...

  9. KingbaseES 数据库安装报错案例分析

    Linux系统安装V008R006C007B0012版本KingbaseES数据库报错:Unsupported major.minor version 52.0 系统版本: [root@vm-10-3 ...

  10. KingbaseES V8R6 空闲事务会话超时自动终止机制

    背景 如果会话在事务中停留的时间过长,则允许自动终止空闲会话.可以由配置参数idle_in_transaction_session_timeout 事务处于空闲状态的时长,它有助于防止被遗忘的交易事务 ...