540. 有序数组中的单一元素

image.png

二分

  1. class Solution {
  2. public int singleNonDuplicate(int[] nums) {
  3. int size = nums.length;
  4. if(size == 1) return nums[0];
  5. int left = 0, right = size -1;
  6. //正常情况下偶数是第一个元素
  7. while (left < right ) {
  8. int mid = left + ( (right - left) >> 1);
  9. if( (mid & 1) == 0 ){
  10. if(nums[mid] == nums[mid + 1]) {
  11. left = mid + 1;
  12. } else {
  13. right = mid;
  14. }
  15. } else {
  16. if(nums[mid] == nums[ mid - 1] ) {
  17. left = mid + 1;
  18. } else {
  19. right = mid;
  20. }
  21. }
  22. }
  23. return nums[right];
  24. }
  25. }
  1. class Solution {
  2. public int singleNonDuplicate(int[] nums) {
  3. int size = nums.length;
  4. if(size == 1) return nums[0];
  5. int left = 0, right = size -1;
  6. //正常情况下偶数是第一个元素
  7. while (left < right ) {
  8. int mid = left + ( (right - left) >> 1);
  9. if( (mid & 1) == 0 ){
  10. if(nums[mid] == nums[mid + 1]) {
  11. //[1,1,2,2,3] left = mid + 2
  12. left = mid + 2;
  13. } else {
  14. right = mid;
  15. }
  16. } else {
  17. //[1,1,2] left + 1
  18. if(nums[mid] == nums[ mid - 1] ) {
  19. left = mid + 1;
  20. } else {
  21. right = mid;
  22. }
  23. }
  24. }
  25. return nums[right];
  26. }
  27. }

亦或

  1. class Solution {
  2. public int singleNonDuplicate(int[] nums) {
  3. int left = 0,right = nums.length - 1;
  4. while (left < right ) {
  5. int mid = left + ((right - left) >> 1 );
  6. //!!!偶数亦或1 等于 加1
  7. //!!!奇数亦或1 等于 减1
  8. if(nums[mid] == nums[mid ^ 1]) {
  9. left = mid + 1;
  10. } else {
  11. right = mid ;
  12. }
  13. }
  14. return nums[right];
  15. }
  16. }