Lc-540
categories: [LeetCode]
tags: [binary search, medium]
540. Single Element in a Sorted Array
题目大意:
给定一个排序好的数组,数组中的每个元素都出现两次,只有一个元素只出现一次, 找到并返回这个元素。
解题思路:
根据题意,它是一个单调递增数组,符合使用二分搜索的条件。
所以这道题可以用二分法来做
首先我们还是想往常一样初始化low 和 high数组两端的下标
然后通过while loop循环, 条件是low < high
然后在while 中通过low 和high求出mid下标
首先我们要判断mid下标是不是odd,因为只出现一次的元素他的下标永远是even
通过分析可能出现的情况, 我们总结如下:
如果mid是odd, 我们让 mid -= 1, 然后判断 nums[mid] == nums[mid+1]
是否相等, 如果相等说明 nums[mid+1]之前的元素都是出现两次
所以 low = mid + 2;
反之,如果不相等则说明nums[mid]之后的元素都符合题目要求,所以high = mid
最后返回nums[low] 因为low == high 说明low 和 high下标都指到同一元素了
注意:
None
复杂度:
Time Coplexity: O(logN)
Space Complexity: O(1)
Code示例:
class Solution {
public int singleNonDuplicate(int[] nums) {
int low = 0, high = nums.length-1;
while (low < high) {
int mid = low + (high - low)/2;
if (mid % 2 == 1) mid--;
if (nums[mid] == nums[mid+1]) {
low = mid + 2;
} else {
high = mid;
}
}
return nums[low];
}
}