楼主:
Rushia (みけねこ的鼻屎)
2023-02-21 11:56:42540. Single Element in a Sorted Array
给你一个已排序整数阵列,里面的所有数字都有恰好两个,只有一个数字只有一个,
找出这个数字是什么,限制时间复杂度:O(logn)且空间复杂度:O(1)。
Example :
Input: nums = [1,1,2,3,3,4,4,8,8]
Output: 2
Input: nums = [3,3,7,7,10,11,11]
Output: 10
思路:
1.看到题目说"阵列已排序"和"时间复杂度O(logn)"就可以确定这题要用二元搜寻来
做了,问题是我们要怎么样才能每次查找都舍弃掉一半不必去查的资料。
2.首先做个边界处理,n == 1 的时候直接返回。
3.把mid作为切点,检查当前mid这个索引数字的左右两边,如果有重复数字就返回两
个重复数字的索引,否则直接返回nums[mid]。
4.要判断要往左边找还是右边找的条件是:判断某一半边的元素数量是否是偶数
举例来说,若index=[3,4]
1 1 2 3 3 4 4
因为所有数字恰好两个且只有一个数字只有一个,所以一定有一边有奇数个元素
所以去除当前重复元素之后的半边如果有奇数个元素就往那边找,另一边舍弃。
5.最后返回nums[l]即可
JavaCode: