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

371 阅读1分钟

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]
}