使用kotlin解决这个问题:剑指 Offer II 070. 排序数组中只出现一次的数字 中等 66 相关企业 给定一个只包含整数的有序数组 nums ,每个元素都会出现两次,唯有一个数只会出现一次,请找出这个唯一的数字。 你设计的解决方案必须满足 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
时间: 2023-12-24 15:03:59 浏览: 106
dotenv-kotlin::old_key:Dotenv是一个从.env文件加载环境变量的模块
可以使用二分查找的思想来解决这个问题。由于数组是有序的,那么对于任意一个出现两次的数字,它们的位置一定是相邻的。因此,我们可以考虑对数组进行二分,每次取中间的数 mid,如果 mid 是出现两次的数字,则 mid-1 和 mid+1 一定与 mid 相等;如果 mid 是唯一的数字,则 mid-1 和 mid+1 一定与 mid 不相等。根据这一特点,我们可以通过二分查找找到唯一的数字。
具体来说,我们可以设 left 和 right 分别为数组的左右两端,mid = (left + right) / 2。如果 mid 满足上述条件之一,则直接返回 mid;否则,我们可以根据 mid 的位置和数值来判断唯一的数字在哪一侧,然后将 left 或 right 移动到相应的位置进行下一轮查找。最终,我们可以找到唯一的数字。
以下是 Kotlin 代码实现:
```kotlin
fun singleNonDuplicate(nums: IntArray): Int {
var left = 0
var right = nums.size - 1
while (left < right) {
val mid = (left + right) / 2
if (mid % 2 == 1) { // mid 为奇数,需要向左移动一位
mid--
}
if (nums[mid] != nums[mid + 1]) { // mid 不是出现两次的数字
right = mid
} else { // mid 是出现两次的数字
left = mid + 2
}
}
return nums[left]
}
```
时间复杂度为 O(log n),空间复杂度为 O(1)。
阅读全文