leetcode
leetcode 3001 ~ 3050
有序数组中的单一元素

有序数组中的单一元素

难度:

标签:

题目描述

English description is not available for the problem. Please switch to Chinese.

代码结果

运行时间: 22 ms, 内存: 17.9 MB


解释

方法:

题解采用了一种扫描方式来查找唯一不重复的元素。由于数组是有序的,并且除了一个唯一的元素外,其他元素都出现两次,算法利用这个特性来跳过成对的元素。具体方法是使用一个指针(left),从数组的开始遍历,每次检查left指针和其相邻元素left+1。如果这两个元素相等,说明它们是一对,因此left指针跳过这两个元素,即left增加2。如果这两个元素不等,说明当前left指向的元素是唯一的不重复元素,直接返回该元素。如果整个数组都被遍历完,最后一个元素是唯一不重复的元素。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
为什么算法在遇到不相等的情况时就可以直接返回当前left指向的元素作为答案?是基于什么假设或保证?
算法基于的假设是数组是有序的,并且除了一个唯一的元素以外,其他所有元素都恰好出现两次。因此,当我们按照步长为2遍历数组时,正常情况下每对相邻的元素应该是相同的。如果在某一步中,left指针指向的元素与其相邻元素不相等,这意味着从数组开始到当前left指针的位置,所有元素都是成对出现的。因此,当前left指向的元素必然是唯一的不重复元素,没有其它元素与之配对,可以直接返回此元素作为结果。
🦆
如果数组中所有元素都是成对的,且唯一的不重复元素位于数组的最末端,那么算法是如何确保能够返回正确结果的?
在这种情况下,当left指针从数组的开始逐步以2的步长增加时,它会成功地跳过所有成对的元素。由于所有成对的元素都被正确处理,left指针最终会指向数组的最后一个元素。此时,由于left指针已经超出了成对元素的范围,而且根据问题设定,最后一个元素是唯一不重复的,因此算法会在最后一次循环中返回这个元素。
🦆
在此题解中,如果left指针指向的是最后一个元素,且之前的所有元素都是成对出现的,为什么算法仍然能正确地返回最后一个元素作为答案?
在算法的设计中,循环的条件是left < n - 1,这确保了只要left未达到数组末尾前的最后一个元素,循环就会继续执行。如果所有之前的元素都成对出现了,那么left指针会最终停在数组的最后一个元素上。在循环结束时,如果left指向的是最后一个元素,根据循环的退出条件,我们知道这个元素未能与前一个元素形成一对,因此它就是唯一的不重复元素,算法会返回这个最后一个元素。

相关问题