首页 > 其他分享 >Leetcode 540. 有序数组中的单一元素

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

时间:2024-10-03 10:34:25浏览次数:5  
标签:二分 nums int 奇数 元素 540 数组 Leetcode left

1.题目基本信息

1.1.题目描述

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

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

你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。

1.2.题目地址

https://leetcode.cn/problems/single-element-in-a-sorted-array/description/

2.解题方法

2.1.解题思路

二分查找(红蓝染色法)

2.2.解题步骤

第一步,确定红蓝染色的特征。特征一:红:位置i处值与处于同一对的元素相等;蓝:位置i处值与处于同一对的元素不相等(如果i为奇数,相邻元素取右边的偶数,反之取左边边的奇数)。特征二:左闭右开,left-1始终指向红色,right始终指向蓝色。

第二步,标准的左闭右开二分步骤。

注意:标准的二分模板会出现索引超范围问题,为了解决超限问题,可以在尾部添加一个不能取到的值。

3.解题代码

Python代码

class Solution:
    # 二分查找(红蓝染色法)
    # 第一步,确定红蓝染色的特征。特征一:红:位置i处值与处于同一对的元素相等;蓝:位置i处值与处于同一对的元素不相等(如果i为奇数,相邻元素取右边的偶数,反之取左边边的奇数)。特征二:左闭右开,left-1始终指向红色,right始终指向蓝色。
    # 第二步,标准的左闭右开二分步骤。
    # 注意:标准的二分模板会出现索引超范围问题,为了解决超限问题,可以在尾部添加一个不能取到的值。
    def singleNonDuplicate(self, nums: List[int]) -> int:
        # 红:i与相邻的对元素相等;蓝:i与相邻元素不相等(如果i为奇数,相邻元素取右边的偶数,反之取左边的奇数)。为了解决超限问题,在尾部添加一个哑结点
        length=len(nums)
        nums.append(-1)
        left,right=0,length
        while left<right:
            mid=(right-left)//2+left
            # neighIndex=mid+1 if mid%2==0 else mid-1
            neighIndex=mid^1
            if nums[mid]==nums[neighIndex]:
                left=mid+1
            else:
                right=mid
        return nums[left]

C++代码

class Solution {
public:
    int singleNonDuplicate(vector<int>& nums) {
        int length=nums.size();
        nums.push_back(-1);
        int left=0,right=length;
        while(left<right){
            int mid=(right-left)/2+left;
            int neighIndex=mid%2==0 ? mid+1 : mid-1;
            if(nums[mid]==nums[neighIndex]){
                left=mid+1;
            }else{
                right=mid;
            }
        }
        return nums[left];
    }
};

4.执行结果

在这里插入图片描述

标签:二分,nums,int,奇数,元素,540,数组,Leetcode,left
From: https://www.cnblogs.com/geek0070/p/18445443

相关文章

  • Java数组
    数组数组概述数组是相同类型数据的有序集合数组声明创建首先必须声明数组变量,才能在程序中使用数组。dataType[]array//首选方法或dataTypearray[]//效果相同,但不是首选方法Java语言使用new操作符来创建数组dataType[]array=newdataType[arraySize];获取数......
  • 代码随想录算法训练营day7|704.二分查找、27.移除元素、977.有序数组的平方
    学习资料:https://programmercarl.com/数组理论基础.html理解:双指针可以同时获取一个数组的两个位置的值二分查找:根据区间范围(左闭右闭、左闭右开)来判断左右指针比较方式刷题记录:704.二分查找(左闭右闭则<=,左右指针,middle=left+(right-left)//2,因为考虑了等号情况所以下一步l......
  • Leetcode 275. H 指数 II
    1.题目基本信息1.1.题目描述给你一个整数数组citations,其中citations[i]表示研究者的第i篇论文被引用的次数,citations已经按照升序排列。计算并返回该研究者的h指数。h指数的定义:h代表“高引用次数”(highcitations),一名科研人员的h指数是指他(她)的(n篇论文中)至......
  • [LeetCode] 1497. Check If Array Pairs Are Divisible by k
    Givenanarrayofintegersarrofevenlengthnandanintegerk.Wewanttodividethearrayintoexactlyn/2pairssuchthatthesumofeachpairisdivisiblebyk.ReturntrueIfyoucanfindawaytodothatorfalseotherwise.Example1:Input:arr......
  • 代码随想录算法训练营第六天|242.有效的字母异位词 ● 349. 两个数组的交集 ● 202.
    ​学习链接:https://programmercarl.com/哈希表理论基础.html学习笔记:遇到“要判断一个值是否在集合中出现过”的问题时,可以考虑hash表。hash表的形式包括数组、set、dict。当数的位数比较统一、或比较小,可用数组,快;当数的位数可变,可用set;当要同时考虑数的下标和值,可以用dict。......
  • C++中指针和数组相关的运算符优先级
    概述本文深入介绍了与指针和数组相关的运算符优先级,利用代码示例展示了当左结合和右结合运算符同时存在时的结合方式,同时也演示了如何使用()来强制人为指定结合顺序。指针、数组相关的运算符优先级下表展示了相关运算符的优先级,有4个级别,同级别内的运算符按照结合性依次调用。......
  • leetcode24 两两交换链表中的节点(swap-nodes-in-pairs)
    题目描述:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1] 提示:链表中节点的数......
  • Leetcode 1193 每月交易(探究当有关联字段有NULL值如何做左右关联
    题目现有一个交易表Transactions,内有id,country,state(列类型为["approved","declined"]),amount金额,trans_date交易日期。编写一个sql查询来查找每个月和每个国家/地区的事务数及其总金额、已批准的事务数及其总金额。以 任意顺序 返回结果表。数据准备CreatetableIfN......
  • Leetcode 1907 按分类统计薪水
    一、题目查询每个工资类别的银行账户数量。 工资类别如下:"LowSalary":所有工资 严格低于 20000 美元。"AverageSalary": 包含 范围内的所有工资 [$20000, $50000] 。"HighSalary":所有工资 严格大于 50000 美元。结果表 必须 包含所有三个类别。 如果某个类......
  • leetcode刷题day34|动态规划Part03 背包问题(01背包问题 二维、01背包问题 一维、416.
    0-1背包问题二维动规五部曲1、确定dp数组以及下标的含义dp[i][j]表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。(取物品时可以是取0-i的任意一个,或者是他们的组合)2、确定递推公式不放物品i:背包容量为j,里面不放物品i的最大价值是dp[i-1][j]......