LeetCode 540. 有序数组中的单一元素
package main
import "fmt"
func singleNonDuplicate(nums []int) int {
//全数组的二分查找
low, high := 0, len(nums)-1 //初始左右边界
for low < high {
mid := low + (high-low)/2
//mid是偶数跟mid+1比较 (因为初始下标为0是偶数)
//mid是奇数跟mid-1比较
if nums[mid] == nums[mid^1] { //mid^1 , mid 与 1 异或
//如果相等证明mid之前没有只出现一次的元素
//缩小左边界
low = mid + 1
} else {
//如果不相等证明mid之前有只出现一次的元素
//缩小右边界
high = mid
}
}
//最后low和high重叠得到结果
return nums[low]
}
func main() {
num := []int{1, 1, 2, 3, 3, 4, 4, 8, 8}
ans := singleNonDuplicate(num)
fmt.Println("ans = ", ans)
}