本题同样是二分查找的应用,不过加入了脑筋急转弯的思想。
也就是当中点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 版权协议,转载请附上原文出处链接和本声明。