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

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

时间:2024-11-10 09:44:21浏览次数:3  
标签:right 数组 nums 复杂度 mid 540 有序 left 2k

文章目录

问题描述

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

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

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

解决思路

  • 题目有两个已知条件:
    数组是有序的。
    除了一个数出现一次外,其余每个数都出现两次。
    第二个条件意味着,数组的长度一定是奇数。

  • 第一个条件意味着,出现两次的数,必然相邻,不可能出现 1,2,1 这样的顺序。
    这也意味着,只出现一次的那个数,一定位于偶数下标上。
    这启发我们去检查偶数下标 2k。

  • 示例 1 的 nums=[1,1,2,3,3,4,4,8,8]:
    如果 nums[2k]=nums[2k+1],说明只出现一次的数的下标 >2k。
    如果 nums[2k]
    =nums[2k+1],说明只出现一次的数的下标 ≤2k。
    也就是说,随着 k 的变大,不等式 nums[2k]
    =nums[2k+1] 越可能满足,有单调性,可以二分。

代码示例


class Solution {
public:
    int singleNonDuplicate(vector<int>& nums) {
        int left = -1, right = nums.size() / 2;
        while (left + 1 < right) {
            int mid = left + (right - left) / 2;
            (nums[mid * 2] != nums[mid * 2 + 1] ? right : left) = mid;
        }
        return nums[right * 2];
    }
};

复杂度分析

  • 时间复杂度:O(logn),其中 n 是 nums 的长度。
  • 空间复杂度:O(1)。

标签:right,数组,nums,复杂度,mid,540,有序,left,2k
From: https://blog.csdn.net/ysw234567/article/details/143655970

相关文章

  • 3255. 长度为 K 的子数组的能量值 II
    文章目录问题描述解题思路代码示例复杂度分析问题描述给你一个长度为n的整数数组nums和一个正整数k。一个数组的能量值定义为:如果所有元素都是依次连续且上升的,那么能量值为最大的元素。否则为-1。你需要求出nums中所有长度为k的子......
  • c中柔性数组
    c99中,结构中最后一个元素允许是未知大小的数组,这就叫柔性数组成员。柔性数组的特点1.结构中柔性数组前必须至少有一个其他成员2.sizeof返回的这种结构大小不包括柔性数组的内存3.包含柔性数组成员的结构用malloc函数进行动态分配,并且分配的内存应该大于结构的大小,以适应柔......
  • 树状数组learning Day1识海社区打卡1st
    鉴于上次省赛的惨烈失败教训,狠狠加训,距离下次沈阳站还有两星期,再次感谢东北大学赐予的外卡机会,你知道的,东北大学一直是我的第二户籍所在地。今天到下星期周末为止估计都会持续更新树状数组和线段树相关的笔记。我的刷题顺序大概会按照[灵神提单](LC-Rating&Training)->codefor......
  • Java入门程序之一维数组的基础运用
    Java入门程序之一维数组的基础运用​本文详细介绍了Java中数组的概念、创建与初始化、一维数组的使用、内存分布以及二维数组。讲解了数组的静态与动态初始化、元素访问与修改、遍历方式。一、数组的基本概念数组的初始化例如:int[]array1=newint[20];//创建一个......
  • AcWing 827:双链表 ← 数组模拟
    【题目来源】https://www.acwing.com/problem/content/829/【题目描述】实现一个双链表,双链表初始为空,支持5种操作:  ●在最左侧插入一个数;  ●在最右侧插入一个数;  ●将第k个插入的数删除;  ●在第k个插入的数左侧插入一个数;  ●在第k个......
  • 二维数组和数组指针数组的关系
    在深入理解指针end中,我在最后写了一长段代码#include<stdio.h>voidtest1(intarr[][5],intx,inty)//voidtest1(int(*p)[5],intx,inty){ for(inti=0;i<x;i++) { for(intj=0;j<y;j++) { //printf("%d",*(*(p+i)+j)); print......
  • 【数据结构】快慢指针探秘:理解链表与数组中的环结构
    在处理链表或数组时,我们经常需要在一次遍历中找到特定的位置或检测某种模式。这时,快慢指针技术就能成为强大的工具,尤其在链表面试题中。本文将详细介绍什么是快慢指针、它们的工作原理,并通过一些实际应用帮助你理解这种技巧。学完后,你将掌握这种技巧的核心以及如何在代码中......
  • Air780E软件指南:C语言内存数组(zbuff)
    一、ZBUFF(C内存数组)简介zbuff库可以用c风格直接操作(下标从0开始),例如buff[0]=buff[3]可以在sram上或者psram上申请空间,也可以自动申请(如存在psram则在psram进行申请,如不存在或失败则在sram进行申请)。操作里面的元素时,可以根据光标进行增删改查。偏移方式有三种:从头......
  • 面向对象基础(2)对象数组、重载与可变个数形参
    3、对象数组数组的元素可以是基本数据类型,也可以是引用数据类型。当元素是引用类型中的类时,我们称为对象数组。案例;定义类Student,包含三个属性:学号number(int),年级state(int),成绩score(int)。创建20个学生对象,学号为1到20,年级和成绩都由随机数确定。问题一:打印出4年级(gra......
  • c语言--数组
    目录1数组创建 1.1定义定长数组1.2定义并初始化数组1.3定义部分初始化的数组2.动态数组(动态分配)2.1使用malloc动态创建数组2.2使用calloc动态创建数组2.3动态数组初始化2.4释放动态数组内存3.变长数组(VLA,VariableLengthArray)4.字符串和字符数组4.1.......