给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。
示例 1:
输入: nums = [1,1,2,3,3,4,4,8,8]
输出: 2
示例 2:
输入: nums = [3,3,7,7,10,11,11]
输出: 10
/*** 思路1:暴力法求解* 直接遍历整个数组,对比它的下一个元素,如果找到了相同的,说明不是,如果不相同,说明就是这个元素* 但是,这种做法要注意,移动指针的时候,需要步长按照2来移动。** 思路2:二分查找* (1)设置3个指针,left=0,right=length-1,mid* (2)当找到中间位置的时候,如果左边元素等于mid位置元素,那么就继续从右边找* (3)如果右边元素等于mid位置元素,那么就继续从左边找,如果没有,直接返回* (4)重点:在找到左右两侧是否有相同元素之后,* 要判断一下这两个元素左右两边哪边是剩下的数组是奇数个,就从哪边继续找。*/int len = nums.length-1;if (len == 0) {return nums[0];}int left = 0,right = len;while(left < right){int mid = left + (right-left) / 2;// 判断左右两边的元素哪个是包含单个元素的(元素个数为奇数个)// 判断mid的大小if (nums[mid-1] == nums[mid]){if ((mid - 1) % 2 == 0) {left = mid + 1;} else {right = mid - 2;}}else if (nums[mid+1] == nums[mid]){// 右边是奇数个if(mid % 2 == 0){left = mid + 2;}else {right = mid - 1;}}else {return nums[mid];}}return nums[left];}}
