题目

image.png
image.png

解题

从题意中可知这个数组的长度是奇数,因为每个元素都会出现两次,唯有一个数只会出现一次,而且还是整数的有序数组。
当使用二分算法后,数组从中间值处划分成两个区域,

  • 第一个区域是数组第一位(L) 数组中间值(mid)
  • 第二区域是数组中间值(mid+1)到数组最后一位

这两个区域会被划分成一个偶数区去和一个奇数区
再看mid 你会发现mid会有三种情况

  • mid = mid-1
  • mid = mid+1
  • mid 不等于mid-1也不等于mid+1

将这种情况整合后你就会发现解题思路

  1. /**
  2. * @param {number[]} nums
  3. * @return {number}
  4. */
  5. var singleNonDuplicate = function(nums) {
  6. let l = 0;
  7. let r = nums.length - 1;
  8. while(l < r) {
  9. const mid = (l + r) >> 1;
  10. const curValue = nums[mid];
  11. const lValue = nums[mid - 1];
  12. const rValue = nums[mid + 1];
  13. if(mid % 2 == 0) {
  14. if(curValue == lValue) r = mid - 2;
  15. else if (curValue == rValue) l = mid + 2;
  16. else return nums[mid]
  17. }else {
  18. if(curValue == lValue) l = mid + 1;
  19. else r = mid - 1;
  20. }
  21. }
  22. return nums[r]
  23. };