力扣第540题【有序数组中的单一元素】

  • Post author:
  • Post category:其他


本题同样是二分查找的应用,不过加入了脑筋急转弯的思想。

也就是当中点mid为偶数时,如果单一元素在mid右侧,那么单一元素左侧都是成对出现的,既满足:nums[偶数]==nums[偶数+1]以及nums[奇数]==nums[奇数-1],此时调整左边界,即low=mid+1,右侧不满足上述条件,直接调整右边界。

在判断符合条件与否时将


nums[偶数]==nums[偶数+1]以及nums[奇数]==nums[奇数-1]

简化为


nums[mid]==nums[mid^1]


思想闪光:想象单一元素的左侧和右侧的值的特点


异或运算的申请妙用

同样是两种方法

左闭右闭:

var singleNonDuplicate = function(nums) {
    let low = 0, high = nums.length - 1;
    while (low <= high) {
        const mid = Math.floor((high - low) / 2) + low;
        if (nums[mid] === nums[mid ^ 1]) {
            low = mid + 1;
        } else {
            high = mid-1;
        }
    }
    return nums[low];
};

左闭右开:

var singleNonDuplicate = function(nums) {
    let low = 0, high = nums.length - 1;
    while (low < high) {
        const mid = Math.floor((high - low) / 2) + low;
        if (nums[mid] === nums[mid ^ 1]) {
            low = mid + 1;
        } else {
            high = mid;
        }
    }
    return nums[low];
};



版权声明:本文为liushu521521原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。