56.有序数组中的单一元素
2022-02-17 本文已影响0人
wo不是黄蓉
day8:540. 有序数组中的单一元素(中等)
思想:
- 使用栈:由于数组中的元素都是成对出现的,因此使用栈对数组内容进行操作,到最后剩的一个就是需要返回的元素
-
使用二分法:还是由于数组中的元素都是成对出现的,因此,去数组长度的中间值,如果mid为偶数说明目标元素在[mid,arr.length]这个区间里面;[参考]
如果Mid为奇数,说明目标元素在[0,mid]这个区间
方法一:
var singleNonDuplicate = function (nums) {
let arr = [];
for (let i = 0, len = nums.length; i < len; i++) {
if (!arr.includes(nums[i])) {
arr.push(nums[i]);
} else {
arr.pop();
}
}
return arr.length > 0 ? arr[0] : null;
}
方法二:
var singleNonDuplicate = function (nums) {
let left=0,right=nums.length-1;
while(left < right){
let mid = (left + right) >>> 1;
//偶数值
if(mid % 2 === 0){
//相等则说明在左边,左边向前移动,取值空间重置为[left,mid]
if(nums[mid] === nums[mid+1]){
left = left +1;
}else{
right = mid;
}
}else{
//奇数值;当基数和前面的一位相等,说明目标在其右侧,左值向前移动,取值空间重置为[mid,right]
if(nums[mid] === nums[mid-1]){
left = left +1
}else{
right = mid
}
}
}
return nums[right]
}